`
zhangyafei_kimi
  • 浏览: 261862 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

C++编译器何时提供默认的构造函数和拷贝构造函数

阅读更多
2008年08月27日 星期三 10:16

总的来说,编译器只在它需要的时候才会合成一个默认构造函数,或者扩张所有已存在的构造函数。

一个类满足下列其中任何一个条件:
1.包含了一个类的对象,这个对象有一个构造函数(包括编译器合成的默认构造函数)
2.如果继承自一些基类,其中某些基类有一个构造函数(包括编译器合成的默认构造函数)
3.有一个虚函数,或者继承到了虚函数
4.有虚基类

如果这个类没有默认的构造函数,编译器就会合成一个默认的构造函数,分别做以下事情
如果这个类有构造函数,编译器就会扩张所有构造函数,做以下事情
1.调用这个对象的构造函数
2.调用基类的构造函数
3.设置正确的虚函数表指针
4.设置指向虚基类对象的指针

如果一个类不满足上面的4个条件,并且没有提供构造函数,编译器也不会为这个类提供默认的拷贝构造函数。

拷贝构造函数类似,对于1,2,判断是否有拷贝构造函数,并调用拷贝构造函数,3,4相同。
但有一点截然不同,即使一个类不满足以上4个条件,并且类没有提供拷贝构造函数,编译器也会合成一个默认的拷贝构造函数,它用字节拷贝的方式拷贝对象。


这种东西实在有些无聊,不是为了找工作才不研究。
分享到:
评论

相关推荐

    C++规定与类同名的函数就是拷贝构造函数

    在类定义中如果没有提供自己的拷贝构造函数,则C++提供一个默认的构造函数,其拷贝策略是逐个成员依次拷贝。 深拷贝和浅拷贝 默认拷贝构造函数均是浅拷贝 但是一个类可能拥有其它资源,如其构造函数分配了一个堆内存...

    详解C++中构造函数,拷贝构造函数和赋值函数的区别和实现

    默认构造函数和拷贝构造函数 析构函数 赋值函数(赋值运算符) 取值函数 **即使程序没定义任何成员,编译器也会插入以上的函数! 注意:构造函数可以被重载,可以多个,可以带参数;析构函数只有一个,不能被重载,...

    详解C++ 拷贝构造函数

    如果在类中没有定义拷贝构造函数,编译器会自行定义一个。如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数。拷贝构造函数的最常见形式如下: classname (const classname &obj) { // 构造函数...

    Effective C++条款06:构造/析构/赋值运算之(若不想使用编译器自动生成的函数,就该明确拒绝)

    在前面一篇文章中(https://blog.csdn.net/qq_41453285/article/details/104165762),我们介绍了C++编译器会为我们的class生成默认的构造函数、析构函数、拷贝构造函数、拷贝赋值运算符 但是有些情况下,我们不...

    解析c++中的默认operator=操作的详解

    并且什么时候提供非无用的默认operator=操作和无用的等操作的情形也和拷贝构造函数类似。(详细分析过程请参考《基于c++中的默认拷贝函数的使用详解》) 对于一个类,编译器会提供非无用的operator=操作的情形: 1 该...

    C++ 最通俗易懂的构造和析构函数讲解

    注意:对象的初始化和清理工作是编译器强制我们要做的事情,即使你不提供初始化操作和清理操作,编译器也会给你增加默认的操作,只是这个默认初始化操作不会做任何事。 构造函数:实例化对象的时候系统自动调用 析构...

    C++ 中类的拷贝、赋值、销毁的实例详解

    如果我们没有定义类的拷贝构造函数的话,那么编译器会为我们合成默认拷贝构造函数—-合成拷贝构造函数。 和成拷贝构造函数的操作是将其参数的各个成员拷贝到正在创建的对象中去,每个成员的类型决定了他是如何被...

    C++空类默认函数详细解析

    定义一个空的C++类,例如 ... // 拷贝构造函数~Empty(); // 析构函数Empty& operator=( const Empty& ); // 赋值运算符Empty* operator&(); // 取址运算符const Empty* operator&() const; // 取址运算符 con

    新手学习C++入门资料

    这些关键字能作为函数和变量的标识符在C程序中使用,尽管C++包含了所有的C,但显然没有任何C++编译器能编译这样的C程序。 C程序员可以省略函数原型,而C++不可以,一个不带参数的C函数原型必须把void写出来。而C++...

    C++11中的Defaulted和Deleted函数

    本文将介绍 C++11 标准的两个新特性:defaulted 和 deleted 函数。...  C++ 的类有四类特殊成员函数,它们分别是:默认构造函数、析构函数、拷贝构造函数以及拷贝赋值运算符。这些类的特殊成员函数负责

    从汇编看c++中的默认拷贝函数

     首先看一个简单的类X,这个类没有显示定义拷贝构造函数。c++源码如下: class X { private:  int i;  int j; }; int main() {  X x1;//先定义对象x1  X x2 = x1;//将x1拷贝给x2 }  下面是其...

    基于c++中的默认拷贝函数的使用详解

    首先看一个简单的类X,这个类没有显示定义拷贝构造函数。c++源码如下: 代码如下:class X {private: int i; int j;}; int main() { X x1;//先定义对象x1 X x2 = x1;//将x1拷贝给x2}下面是其汇编代码: 代码如下:_...

    传智播客_C++基础课程讲义_v1.0.7

    3.6构造函数和析构函数的调用顺序研究 6 3.7构造函数和析构函数综合练习 6 3.8 对象的动态建立和释放 6 4静态成员变量成员函数 6 4.1静态成员变量 6 4.2静态成员函数 6 4.3综合训练 6 5 C++面向对象模型初探 6 5.1...

    浅谈c++构造函数问题,初始化和赋值问题

    默认构造函数(就是没有参数的构造函数) The Default Constructor The default constructor is the constructor used to create an object when you don’t provide explicit initialization values. That is, it’...

    深入理解C++11:C++11新特性解析与应用

    专用为末 573.1 继承构造函数 573.2 委派构造函数 623.3 右值引用:移动语义和完美转发 683.3.1 指针成员与拷贝构造 683.3.2 移动语义 693.3.3 左值、右值与右值引用 753.3.4 std::move:强制转化为右值 803.3.5 ...

    摩托罗拉C++面试题

    (4) 引用的创建和销毁并不会调用类的拷贝构造函数 (5) 语言层面,引用的用法和对象一样;在二进制层面,引用一般都是通过指针来实现的,只不过编译器帮我们完成了转换. 不存在空引用,并且引用一旦被初始化为指向一...

    C++ 定义一个类,类的成员变量没有指针

     //没有明确写出构造和析构,编译器会使用默认构造、拷贝赋值、析构。  };    //测试程序  void testDsSize()  {  DsSize s1; //默认构造  DsSize s2(s1); //默认拷贝构造  DsSize s3 = s2; //默认拷贝...

    详解C++-(=)赋值操作符、智能指针编写

    默认的赋值操作符和默认的拷贝构造函数有相同的存在意义 (=)赋值操作符注意事项 首先要判断两个操作数是否相等 返回值一定是 return *this; 返回类型是Type&型,避免连续使用=后,出现bug 比如: class Test{ int *p...

    LuaBind 源码 (Lua增强库)

    你可以给构造函数设定一个名字,例如: module(L, "my_library") [ // declarations ]; 这里所有的申明都将被放置在 my_libary 表. 如果你想要嵌套名空间,你可以用 luabind::namespace_ 类. 它和 luabind::module ...

Global site tag (gtag.js) - Google Analytics