精华内容
下载资源
问答
  • 在上面的代码中,是使用类A的对象好,还是对象指针比较好呢?很多时候,我们都没有深刻考虑过这两种情况,似乎在一个类中 都可以满足我们的需求。这种问题在stackoverflow上当然有回复: t’s very

    引子:

    class A{};
    class B{
      public:
        B();
        ~B();
      private:
        A object_a;
        A * ptr_a;
    };

    在上面的代码中,是使用类A的对象好,还是对象指针比较好呢?

    很多时候,我们都没有深刻考虑过这两种情况,似乎在一个类中 都可以满足我们的需求。

    这种问题在stackoverflow上当然有回复:
    t’s very unfortunate that you see dynamic allocation so often. That just shows how many bad C++ programmers there are.
    非常不幸,你在代码中遇到这么多的动态内存分配,但这个只能说明有现在有太多不合格的 C++ 程序员。
    哭死

    In a sense, you have two questions bundled up into one. The first is when should we use dynamic allocation (using new)? The second is when should we use pointers?
    这么说吧,你的两个问题本质上是同个问题。第一个问题是,应该何时使用动态分配(使用 new 方法)?第二问题是,什么时候该使用指针?

    The important take-home message is that you should always use the appropriate tool for the job. In almost all situations, there is something more appropriate and safer than performing manual dynamic allocation and/or using raw pointers.
    最先要牢记的重点是,你应该根据实际需求选择合适的方法。 一般来说,使用定义对象的方式比起使用手工动态分配(或new指针)的方式会更加合理以及安全。

    It’s very unfortunate that you see dynamic allocation so often. That just shows how many bad C++ programmers there are.

    In a sense, you have two questions bundled up into one. The first is when should we use dynamic allocation (using new)? The second is when should we use pointers?

    The important take-home message is that you should always use the appropriate tool for the job. In almost all situations, there is something more appropriate and safer than performing manual dynamic allocation and/or using raw pointers.

    Dynamic allocation

    In your question, you’ve demonstrated two ways of creating an object. The main difference is the storage duration of the object. When doing Object myObject; within a block, the object is created with automatic storage duration, which means it will be destroyed automatically when it goes out of scope. When you do new Object(), the object has dynamic storage duration, which means it stays alive until you explicitly delete it. You should only use dynamic storage duration when you need it. That is, you should always prefer creating objects with automatic storage duration when you can.

    The main two situations in which you might require dynamic allocation:

    You need the object to outlive the current scope - that specific object at that specific memory location, not a copy of it. If you’re okay with copying/moving the object (most of the time you should be), you should prefer an automatic object.
    You need to allocate a lot of memory, which may easily fill up the stack. It would be nice if we didn’t have to concern ourselves with this (most of the time you shouldn’t have to), as it’s really outside the purview of C++, but unfortunately we have to deal with the reality of the systems we’re developing for.
    When you do absolutely require dynamic allocation, you should encapsulate it in a smart pointer or some other type that performs RAII (like the standard containers). Smart pointers provide ownership semantics of dynamically allocated objects. Take a look at std::unique_ptr and std::shared_ptr, for example. If you use them appropriately, you can almost entirely avoid performing your own memory management (see the Rule of Zero).

    动态分配
    你的提问中,所列出的两种分配对象方式的主要区别在于对象的生存期。通过 Object myObject 方式定义对象,对象的生存期是在其作用域内自维护(automatic storage),这个意味着程序离开对象的作用域之后,对象将被自动销毁。当通过 new Object() 方式分配对象时,对象的生存期是动态的,这个意味着若不显式地 detete 对象,对象将一直存在。你应该只在必要的时候使用动态分配对象。换句话说,只要有可能,你应该首选定义可自维护的对象。

    这里是两个常见需要动态分配对象的情况:

    分配不限制作用域的对象,对象存储在其特定的内存中,而不是在内存中存储对象的拷贝。如果对象是可以拷贝/移动的,一般情况下你应该选择使用定义对象的方式。
    定义的对象会消耗大量内存,这时可能会耗尽栈空间。如果我们永远不需要考虑这个问题那该多好(实际大部分情况下,我们真不需要考虑),因为这个本身已经超出 C++ 语言的范畴,但不幸的是,在我们实际的开发过程中却不得不去处理这个问题。
    当你确实需要动态分配对象时,应该将对象封装在一个智能指针(smart pointer)或其他提供RAII机制的类型中(类似标准的 container)。智能指针提供动态对象的所有权语义(ownership),具体可以看一下std::unique_ptr 和 std::shared_ptr 这两个例子。如果你使用得当,基本上可以避免自己管理内存(具参见 Rule of Zero)。

    Pointers

    However, there are other more general uses for raw pointers beyond dynamic allocation, but most have alternatives that you should prefer. As before, always prefer the alternatives unless you really need pointers.

    You need reference semantics. Sometimes you want to pass an object using a pointer (regardless of how it was allocated) because you want the function to which you’re passing it to have access that that specific object (not a copy of it). However, in most situations, you should prefer reference types to pointers, because this is specifically what they’re designed for. Note this is not necessarily about extending the lifetime of the object beyond the current scope, as in situation 1 above. As before, if you’re okay with passing a copy of the object, you don’t need reference semantics.
    You need polymorphism. You can only call functions polymorphically (that is, according to the dynamic type of an object) through a pointer or reference to the object. If that’s the behaviour you need, then you need to use pointers or references. Again, references should be preferred.
    You want to represent that an object is optional by allowing a nullptr to be passed when the object is being omitted. If it’s an argument, you should prefer to use default arguments or function overloads. Otherwise, you should prefer use a type that encapsulates this behaviour, such as boost::optional (or perhaps soon, std::optional - Edit std::optional is voted out of the current C++14 draft n3797).
    You want to decouple compilation units to improve compilation time. The useful property of a pointer is that you only require a forward declaration of the pointed-to type (to actually use the object, you’ll need a definition). This allows you to decouple parts of your compilation process, which may significantly improve compilation time. See the Pimpl idiom.
    You need to interface with a C library or a C-style library. At this point, you’re forced to use raw pointers. The best thing you can do is make sure you only let your raw pointers loose at the last possible moment. You can get a raw pointer from a smart pointer, for example, by using its get member function. If a library performs some allocation for you which it expects you to deallocate via a handle, you can often wrap the handle up in a smart pointer with a custom deleter that will deallocate the object appropriately.

    指针

    当然,不使用动态分配而采取原始指针(raw pointer)的用法也很常见,但是大多数情况下动态分配可以取代指针,因此一般情况应该首选动态分配的方法,除非你遇到不得不用指针的情况。

    1. 使用引用语义(reference semantics)的情况。有时你可能需要通过传递对象的指针(不管对象是如何分配的)以便你可以在函数中去访问/修改这个对象的数据(而不是它的一份拷贝),但是在大多数情况下,你应该优先考虑使用引用方式,而不是指针,因为引用就是被设计出来实现这个需求的。注意,采用这种方式,对象生存期依旧在其作用域内自维护。当然,如果通过传递对象拷贝可以满足要求的情况下是不需要使用引用语义。

    2. 使用多态的情况。通过传递对象的指针或引用调用多态函数(根据入参类型不同,会调用不同处理函数)。如果你的设计就是可以传递指针或传递引用,显然,应该优先考虑使用传递引用的方式。

    3. 对于入参对象可选的情况,常见的通过传递空指针表示忽略入参。如果只有一个参数的情况,应该优先考虑使用缺省参数或是对函数进行重载。要不然,你应该优先考虑使用一种可封装此行为的类型,比如 boost::optional (或者std::optional,已经在 C++ 14 草案 n3797 14 中发布 )。

    4. 通过解耦编译类型依赖减少编译时间的情况。使用指针的一个好处在于可以用于前向声名(forward declaration)指向特定类型(如果使用对象类型,则需要定义对象),这种方式可以减少参与编译的文件,从而显著地提高编译效率,具体可以看 Pimpl idiom 用法。

    5. 与C库或C风格的库交互的情况。此时只能够使用指针,这种情况下,你要确保的是指针使用只限定在必要的代码段中。指针可以通过智能指针的转换得到,比如使用智能指针的get成员函数。如果C库操作分配的内存需要你在代码中维护并显式地释放时,可以将指针封装在智能指针中,通过实现 deleter 从而可以有效的地释放对象。

    在函数形参中使用对象指针更好
    再看一个例子:

    void fun(Base b) { ... }
    void gun(Base* b) { ... }
    void hun(Base& b) { ... }
    
    Base b;
    fun(b);  // copies b, potentially expensive 
    gun(&b); // takes a pointer to b, no copying
    hun(b);  // regular syntax, behaves as a pointer

    Efficiency
    Passing objects to functions mean creating new copies of object.

    Working with objects from third party libraries.
    If your object belongs to a third party code and the authors intend the usage of their objects through pointers only (no copy constructors etc) the only way you can pass around this object is using pointers. Passing by value may cause issues. (Deep copy / shallow copy issues).

    if the object owns a resource and you want that the ownership should not be sahred with other objects.

    展开全文
  • 为什么Python中万物皆对象

    千次阅读 2018-08-14 16:41:23
    Java虽然也是面向对象编程的语言,但是血统没有Python纯正。比如Java的八种基本数据类型之一int,在持久化的时候,就需要包装成Integer类对象。但是在python中,一切皆对象。数字、字符串、元组、列表、字典、函数、...

    Python中一切皆对象

    Python从设计之初就是一门面向对象的语言,它有一个重要的概念,即一切皆对象。

    Python与java的区别:

    Java虽然也是面向对象编程的语言,但是血统没有Python纯正。比如Java的八种基本数据类型之一int,在持久化的时候,就需要包装成Integer类对象。但是在python中,一切皆对象。数字、字符串、元组、列表、字典、函数、方法、类、模块等等都是对象,包括你的代码。


    对象的概念

    究竟何谓对象?不同的编程语言以不同的方式定义“对象”。某些语言中,它意味着所有对象必须有属性和方法;另一些语言中,它意味着所有的对象都可以子类化。

    在Python中,定义是松散的,某些对象既没有属性也没有方法,而且不是所有的对象都可以子类化。但是Python的万物皆对象从感性上可以解释为:Python 中的一切都可以赋值给变量或者作为参数传递给函数。

    Python 的所有对象都有三个特性:

    • 身份:每个对象都有一个唯一的身份标识自己,任何对象的身份都可以使用内建函数 id() 来得到,可以简单的认为这个值是该对象的内存地址。
    >>> a = 1
    >>> id(a)
    >>> 26188904                        # 身份由这样一串类似的数字表示
    • 类型:对象的类型决定了对象可以保存什么类型的值,有哪些属性和方法,可以进行哪些操作,遵循怎样的规则。可以使用内建函数 type() 来查看对象的类型。
    >>> type(a)
    <type 'int'>
    >>> type(type)
    <type 'type'>                         #万物皆对象,type 也是一种特殊的对象 type
    • 值:对象所表示的数据
    >>> a
    1

    "身份"、"类型"和"值"在所有对象创建时被赋值。如果对象支持更新操作,则它的值是可变的,否则为只读(数字、字符串、元组等均不可变)。只要对象还存在,这三个特性就一直存在。

    对象的属性:大部分 Python 对象有属性、值或方法,使用句点(.)标记法来访问属性。最常见的属性是函数和方法,一些 Python 对象也有数据属性,如:类、模块、文件等

    展开全文
  • 为什么程序员都找不到对象?

    千次阅读 2017-06-09 11:35:43
    为什么程序员都找不到对象 我是程序员 我也没有对象- -。我能怎么办 我也很绝望啊。。抛开那些名花名草有主的人,剩下的都是单身汪了,眼瞅着马上就是老大不小了,看着你们这般捉急达妹表示也是可以理解的!今天,来...

    为什么程序员都找不到对象 我是程序员 我也没有对象- -。我能怎么办 我也很绝望啊。。

    抛开那些名花名草有主的人,剩下的都是单身汪了,眼瞅着马上就是老大不小了,看着你们这般捉急达妹表示也是可以理解的!

    今天,来分析分析吧~这结果也是没sei了!

    1、 程序员找不到对象,一般有三种情况:C#、JAVA都有对象,但是经常找不到对象。ASM C直接没有对象。javascript都是伪对象,最多算暧昧。

    但C++日子一直都好过,因为C++是多继承,富二代呀!!!
    图片描述
    2、 世界上最遥远的距离不是生与死,而是你亲手制造的BUG就在你眼前,你却怎么都找不到她。
    图片描述
    3、 《c++程序设计语言》比《c程序设计语言》厚了几倍。。。果然有了对象就麻烦很多。。。
    图片描述
    4、 为什么程序员总是分不清万圣节和圣诞节?因为 Oct 31 == Dec 25。
    图片描述
    5、 Keyboard not found … press F1 to continue
    图片描述
    6、 杀一个程序员不需要用枪,改三次需求就可以了
    图片描述
    7、 四个2B青年掐架。A:你丫等着,我爹是敏感词!B:我爹在网上搜索根本无法显示!!C: 我爹404 not found!!!D:我爹Connection Reset !!!!
    图片描述
    8、 今天吃饺子,我说:“宝宝,你数数你想吃几个饺子?”“0,1,2,3。”一边说着一边拿起一个饺子,“这是第0个。”老婆怒吼:“下一代还是做程序员的命!”
    图片描述
    9、 程序猿:我的第一个问题是,对于我第二个和第三个问题,你可不可以只用‘能’和‘不能’来回答?老板:“OK!”我的第二个问题是,如果我的第三个问题是我能不能涨工资?那么你对于我的第三个问题的答案能不能和第二个问题的答案一样?老板:。。。。。。
    大家可以点击加入群:623241711【JAVA大牛学习交流】里面有Java高级大牛直播讲解知识点 走的就是高端路线(如果你想跳槽换工作 但是技术又不够 或者工作上遇到了瓶颈 我这里有一个JAVA的免费直播课程 讲的是高端的知识点基础不好的误入哟 只要你有1-5年的开发经验可以加群找我要课堂链接 注意:是免费的 没有开发经验误入哦)
    js前端交流群:615496236
    现在问题就来了 请问各大程序员都有对象吗 我已经单身23年了 给大家分析一下 我为什么找不到对象 从我18岁开始接触it这个行业 就变成了理科生 直男癌 只从接受互联网 发现自己的时间就变少了 成了一个宅男 知道现在 每天就是上班 下班 吃饭 上班 怎么可能有时间去找对象 - -,每日与bug作斗争 日渐消瘦 。 如果你们没有对象 那么有一个办法 NEW一个吧 哈哈哈 万物阶对象。

    展开全文
  • 在使用session或者hibernateTemplate的save()方法后得不到持久化对象的id值,得到的持久化对象的id值一直为0。因为hibernate逆向生成的表的配置文件中,没有设置自动增长,所以需要我们手动设置。在id中添加...

    在使用session或者hibernateTemplate的save()方法后得不到持久化对象的id值,得到的持久化对象的id值一直为0。

    因为hibernate逆向生成的表的配置文件中,没有设置自动增长,所以需要我们手动设置。


    在id中添加generator就可以解决了。

    之后使用save()方法就会得到id值。

    展开全文
  • 什么是面向对象编程

    万次阅读 多人点赞 2020-01-12 18:57:20
    本文关键字:面向对象、面向过程、面向过程编程...为什么我明明听懂了却还是解决不了实际的问题,甚至于完成不了相应的练习?这其中最主要的原因是什么呢?除了埋怨出的题目跨度太大意外,我们也应该好好的反思一下。
  • 首先,java是一门灵活的语言,到达同一个目的,可以有无数种方法,这个...如果没有移除,这个对象一直存在,久而久之,会引起内存泄露问题。 第三,使用spring中的IOC就能很好的解决上述问题,使用IOC创建对象的...
  • Java——深入理解Class对象(一):什么是Class对象

    千次阅读 多人点赞 2018-11-28 21:05:03
    Class对象到底是什么呢?今天我们就来深入了解一下它。 1.RTTI的概念 RTTI(Run-Time Type Identification),即运行时类型识别,这个词一直是 C++ 中的概念,至于Java中出现RRTI的说法则是源于《Thinking in Java...
  • 1.新建一个person类,什么都不用写,直接输出new person()对象 得到结果   2.一层一层找源码:PrintStream 主要是  String s = String.valueOf(x); 这段话,我们先看看print(s) ,newL...
  • 原文:Constructors of Sub ...1.为什么在创建子类对象的时候会调用父类的构造函数? public class Sub extends Super{ public Sub() { System.out.println("Sub"); } public static void main(...
  • 大学毕业好几年了,父母开始着急了,介绍了好多相亲对象,都被我拒绝见面了 我从内心是不想走相亲这条路的,我还没有谈过恋爱,虽然是个汉子,但总想象有一个美好的恋爱[img=...
  • 相信很多小伙伴学习了javascript,但是对于对象只是有一个初步的认识,并且对于对象的原型和原型链之类的概念还没有很好的认识吧,本篇文章带你们一步步了解对象。 正文 相信很多小伙伴都是冲着原型和原型链的概念...
  • 必须具备JavaScript中对象的概念,如果有想要深入了解的小伙伴,可以查看我之前剖析的js中对象概念的一篇文章——充分了解JavaScript中的对象,顺便弄懂你一直不明白的原型和原型链,如果没空看的小伙伴也关系,我...
  • 今天在csdn上看到一个特别有趣的话题,hibernate3为什么必须使用事务才能保存对象,我相信这个问题对很多人来说都非常困惑包括我自己,于是挂上hibernate源码,一直跟踪最底层,也发现什么,然而正是因为没用发现...
  • 千万不要把数据存储在Application对象中 may 5, 2013 在我们的应用程序中有些数据需要在多处使用。有可能是一个会话令牌,花费很大代价才得来的结果,等等。而且我们总是想避免在两个Activity之间传
  • android 告诉你Application中存储对象,为什么有的时候为空的情况
  • ![图片说明](https://img-ask.csdn.net/upload/201507/24/1437668927_304110.png) 自觉代码错,但程序一直报这个错,望帮助,谢谢
  • java面向对象

    万次阅读 多人点赞 2018-08-21 16:51:59
    包括面向对象概念、类与对象的关系、封装、构造函数、this关键字、static关键字、单例设计模式、继承、多态、内部类、异常、包等java基础知识。 1、面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是...
  • 一直以来都搞不清这几个对象到底什么关系,通过资料查阅,自己的理解如下:  JS对象:javascript对象,在js代码里面定义的对象对象有属性和方法)。  DOM对象:其实就是定义好了的JS对象,只不过针对规范...
  • 金蝶客户端装完之后,首先运行金蝶工具中的远程组件配置工具,若是报错ACtiveX不能创建对象,按下列处理: 1、先查看一下C:\WINDOWS\system32文件夹下是否有scrrun.dll这个文件。有的话直接跳到第3步。 2、如果...
  • 分享一个克隆自己在github上的代码仓库(体积比较大)出现一直在接收对象的问题的解决办法。 一,问题出现: 由于自己的不小心把本地的一个代码库给删除了,这个库上传过几个80MB的大文件,使用git clone命令想把...
  • 面向对象基本概念

    万次阅读 多人点赞 2019-02-06 21:56:15
    面向对象就是:把数据及对数据的操作方法放在一起,作为一个相互依存的整体——对象。对同类对象抽象出其共性,形成类。类中的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部接口与外界发生关系,对象...
  • 面向对象的概述

    千次阅读 热门讨论 2013-12-18 21:53:32
    说了多少遍,在软工之前,也一直没有接触到一个明确的定义。  在软件工程中,Coad 和Yourdon给出了一个定义: 面向对象=对象+类+继承+通信 如果一个软件系统是使用这样4个概念设计和实现的,则我们认为这个软件系统...
  • 对象是null还是空对象

    千次阅读 2018-03-12 21:36:44
    今天写代码遇到一个问题,是以前没有注意到的,就是在判断UserInfo对象是不是空的时候,我的方法是new UserInfo去接受返回值,然后我在判断这个对象是不是null的时候,一直返回的是这个这个对象不是空.然后我查询了一下,...
  • 众所周知,游戏开发中内存和性能一直是影响用户游戏体验的至关重要的两个因素,这次说一说对象池的概念。 对象池意义是将游戏中反复创建销毁的对象进行多次利用,从而避免大量对象的销毁与创建而造成CPU的负担。...
  • java对象——new对象的理解

    万次阅读 多人点赞 2016-12-23 15:39:55
    学了好长时间的java对于java中的对象一直没有理清楚,今天楼主对java中的对象进行了整理,希望对大家有帮助。  理解和使用java中的对象,我们首先了解一下构造方法与对象的创建。 类是面向对象语言中最重要的一种...
  • PHP对象与MAP映射对象的实例

    千次阅读 2019-02-20 17:31:10
    需求:PHP关于对象与string key映射对象一直没看到出现,就自己测试了一下,下面直接上代码! 环境:PHP5.6 &lt;?php class person{ private $number= -1; private $address= ""; public ...
  • 吃人的那些 Java 名词:对象、引用、堆、栈

    万次阅读 多人点赞 2019-09-05 15:57:09
    作为一个有着 8 年 Java 编程经验的 IT 老兵,说起来很惭愧,我被 Java 当中的...每次我看到这几个名词,都隐隐约约觉得自己在被一只无形的大口慢慢地吞噬,只剩下满地的衣服碎屑(为什么不是骨头,因为骨头也好吃)。
  • 匿名对象的理解

    千次阅读 2018-08-30 13:40:02
    在 Java中匿名对象一直比较难理解,我们先说一下匿名对象的使用情形有哪些? 只使用对象一次, 可以作为实际参数来传递,传递一个对象,里面就...什么叫做匿名对象,就是指对象的名字没有,看不见。简称匿名。 ...
  • javaweb面向对象

    千次阅读 2018-04-09 09:48:22
    也许是从一开始学习java就被定向的思维引导了,只知道java是一个面向对象的语言,面向对象的抽象继承封装多态,也许是因为Spring框架用的多了,渐渐地就忘记了如何去面向对象编程,从一开始到现在好像就没有好好思考...
  • gson数据格式转化为对象或者集合等

    千次阅读 2015-11-18 14:30:50
    后台传过来的数据格式都是JSON,那时苦死小编了,大量的方法里写了JSON转化为对象或者集合这些重复的代码,当时也想把这些给拿出来进行封装,说来惭愧由于对JAVA的泛型不熟,导致一直没封装出满意的,一直到今天重新...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 796,316
精华内容 318,526
关键字:

为什么一直没有对象