`
zhangyafei_kimi
  • 浏览: 265553 次
  • 性别: 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++的关键概念,如命名空间(namespace)、类成员(Class members)、成员...

    C++面试试题-拷贝构造函数

    如果拷贝构造函数没有被明确定义,则编译器会自动生成一个默认版本。然而,默认的拷贝构造函数通常执行的是浅复制(shallow copy),即仅仅复制对象的指针或其他引用,而不是真正地复制其所指向的数据。这种行为在...

    构造函数和复制构造函数

    构造函数和复制构造函数的详细介绍 构造函数是C++中的一种特殊函数,它们...构造函数、复制构造函数和拷贝构造函数是C++中三个基本的函数,它们之间有着紧密的联系,并且在对象的初始化和复制操作中扮演着重要的角色。

    c++ 类的定义 和构造函数

    1. **默认构造函数**:无参数的构造函数称为默认构造函数,如果没有显式定义,编译器会自动提供一个默认构造函数。 ```cpp class Person { public: Person() : age(0), name("") {} // 默认构造函数 private: ...

    拷贝构造函数.rar

    此外,如果类中定义了拷贝构造函数,C++编译器将不会自动生成默认的拷贝构造函数,因此需要特别注意是否需要自定义实现。在某些情况下,如果类中没有资源管理(如动态内存或文件句柄),默认的拷贝构造函数可能已经...

    详解C++ 拷贝构造函数

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

    c++构造函数实例质料

    然而,当我们在类中定义了构造函数,即使是无参数的,编译器就不会再提供默认构造函数,因此,`Student a;`这样的对象创建将会使用这个自定义的无参数构造函数。 接着,我们看到一个带参数的构造函数,即`Teacher`...

    有关c ++的题目,关于构造函数和拷贝构造函数的知识点

    同时,编译器还会提供一个默认的拷贝构造函数,用于复制`guyuan`类的对象。 ##### 2.2 `employee` 类 ```cpp class employee { private: char name[20]; char address[20]; char post[20]; public: add(char *...

    构造函数实例(源码)

    例如,在C++中,如果你没有定义任何构造函数,编译器会自动提供一个默认构造函数。默认构造函数的定义如下: ```cpp class MyClass { public: MyClass() { // 默认构造函数 // 初始化代码 } }; ``` 接下来是...

    C++拷贝构造函数详解1

    如果未定义拷贝构造函数,编译器会提供一个默认的,但这个默认拷贝构造函数只进行浅复制,可能无法处理复杂对象的正确复制。 四、深拷贝与浅拷贝 默认的拷贝构造函数执行的是浅拷贝,即复制指针本身而不复制指针...

    c++(7) 构造和析构函数

    如果类中有至少一个用户定义的构造函数,那么编译器将不再提供默认构造函数。 **示例**: ```cpp class MyClass { public: MyClass() { // 默认构造函数 // 初始化逻辑 } }; ``` 1. **默认构造函数**: - 如果...

    C++构造函数.pdf

    总之,虽然C++编译器会为类生成默认的构造函数、析构函数、拷贝构造函数和赋值运算符,但在某些情况下,为了确保对象的正确初始化、复制和清理,程序员必须自定义这些函数。理解并正确使用这些函数是成为一名熟练的...

    完全掌握C++编程中构造函数使用的超级学习教程

    C++11引入了一些关于构造函数的新特性,如列表初始化、移动构造函数和拷贝构造函数的优化等,这些都极大地提高了C++的效率和安全性。 总之,理解和熟练掌握构造函数是C++编程的关键,它们在对象生命周期管理中扮演...

    2.2拷贝构造函数(copyconstuctor)共2页

    为了提高性能,可以考虑使用编译器提供的“编译器合成的默认拷贝构造函数”,如果类的成员变量没有特殊要求(如动态内存分配的成员),编译器生成的拷贝构造函数通常已经足够。 此外,需要注意的是,如果类中有动态...

    2.4+拷贝构造函数1

    需要注意的是,如果程序员没有自定义拷贝构造函数,C++编译器会提供一个默认的拷贝构造函数,它执行逐个成员的按位复制,适用于基本类型和不可变类型。但对于包含动态分配资源的类,这种默认行为可能不适用,可能...

    拷贝构造函数..........

    在C++中,如果没有显式定义拷贝构造函数,编译器会自动生成一个默认的拷贝构造函数,执行浅复制。但在很多情况下,这种浅复制是不够的,例如: - 对象包含指针成员指向动态分配的内存,需要在拷贝构造函数中重新...

    C++有子对象的派生类的构造函数

    1. 默认构造函数:如果子对象没有显式提供构造函数,编译器会为它提供一个默认构造函数,用于初始化数据成员为默认值。 2. 显式构造函数调用:可以使用成员初始化列表(member initialization list)来指定子对象的...

Global site tag (gtag.js) - Google Analytics