对象-编译器合成默认拷贝构造函数问题

问题描述

编译器合成默认拷贝构造函数问题

看《深度探索C++对象模型》遇到的问题。
P49里的例子对于bitwise copy semantics展现了memberwise的拷贝,但是后面P50下面说bitwise copy semantics不需要合成拷贝构造函数。
在P52页的两个例子中,第一个说没合成,我的理解也就是没有初始化int和char*,但之后的第二个合成了拷贝构造函数,不仅初始化了string,更初始化了int.

我又用vs测试了下,发现可以运行

class B {
public:
    int cc = 10;
};

int main() {
    B b;
    cout << b.cc << endl;
    B c = b;
    cout << c.cc << endl;
}

解决方案

简单数据类型,可以直接用缺省构造函数,浅拷贝也没什么问题

解决方案二:

拷贝构造函数的问题
关于拷贝构造函数的一个问题
C++编译器合成构造函数的问题

时间: 2024-10-26 11:49:54

对象-编译器合成默认拷贝构造函数问题的相关文章

对象-编译器合成默认构造函数问题

问题描述 编译器合成默认构造函数问题 最近看<深度探索C++对象模型>,遇到了一个疑问. 在4种情况下会合成nontrivial构造函数,那其他情况到底是[没有合成构造函数]还是合成了无用的[trivial构造函数]? 虽然这两者的外在表现一样,但内部这个构造函数是否被合成? P40框内说合成,P47结尾又说没有被合成. 书中还有一句"Default constructor的合成操作只有在constructor真正需要被调用时才会发生",那么对以下语句是否合成了构造函数?

关于c++中默认拷贝构造函数的理解

问题描述 关于c++中默认拷贝构造函数的理解 如题,请解释一次详细的原理 假如我定义一个类的对象a,然后在没有自己编写构造函数的情况下用语句A b=a来初始化新的对象b,会发生什么,为什么? 解决方案 编译器会给你产生一个默认的拷贝构造函数,执行的是浅拷贝.所谓浅拷贝,就是直接字段的拷贝.如果对象包含一个指针,那么两个对象都指向同一个地址. 解决方案二: 如果未提供自己的拷贝构造函数,则C++提供一个默认拷贝构造函数,就像没有提供构造函数时,C++提供默认构造函数一样. C++提供的默认拷贝构造

c++类默认拷贝构造函数---浅复制

类默认的拷贝构造函数是浅复制,比如如下程序,类中指向的地址是一样的 #include <iostream> using namespace std; class Test { public: int *a; }; int main() { Test *t = new Test(); int aa = 1314520; t->a = &aa; Test *t2 = new Test(*t); cout<<t->a<<endl; cout<<

拷贝构造函数和拷贝赋值运算符的调用问题

问题描述 拷贝构造函数和拷贝赋值运算符的调用问题 假设有如下类:class HasPtr{public: HasPtr(const string &s): ps(new string(s))i(0){} HasPtr(const HasPtr &hp){ ps=new string(*hp.ps); i=hp.i; } HasPtr(const char *s):ps(new string(s))i(0){} HasPtr & operator=(const HasPtr &

C++类对象的拷贝构造函数分析

对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=100;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. #include <iostream>using namespace std;class CA{ public: CA(int b) { a=b; } void Show () { cout<<a<<endl; } private: int a;};int main(){

C++类对象的复制-拷贝构造函数

在学习这一章内容前我们已经学习过了类的构造函数和析构函数的相关知识,对于普通类型的对象来说,他们之间的复制是很简单的,例如: int a = 10; int b =a; 自己定义的类的对象同样是对象,谁也不能阻止我们用以下的方式进行复制,例如: #include <iostream>using namespace std;class Test{public: Test(int temp) { p1=temp; }protected: int p1;};void main(){ Test a(9

C++中拷贝构造函数的应用详解_C 语言

一.C++中拷贝构造函数的定义: 有一个参数的类型是其类类型的构造函数是为拷贝构造函数. 如下所示: X::X( const X& x); Y::Y( const Y& y, int =0 ); //可以是多参数形式,但其第二个即后继参数都有一个默认值 二.拷贝构造函数的应用: 当一个类对象以另一个同类实体作为初值时,大部分情况下会调用拷贝构造函数. 一般是这三种具体情况: 1.显式地以一个类对象作为另一个类对象的初值,形如X xx=x; 2.当类对象被作为参数交给函数时. 3.当函数返回

C++拷贝构造函数

拷贝构造函数 对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=88; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量. 本文地址:http://www.cnblogs.com/archimedes/p/cpp-copy-constructor.html,转载请注明源地址. 1.对象的定义形式 C++支持两种定义形式:直接初始化和复制初始化,复制初始化采用=符号,直接初始化将初始化式放在圆括号中 用于类类型对象时,直接初始化直接调用与实

c++中拷贝构造函数的参数类型必须是引用

如果拷贝构造函数中的参数不是一个引用,即形如CClass(const CClass c_class),那么就相当于采用了传值的方式(pass-by-value),而传值的方式会调用该类的拷贝构造函数,从而造成无穷递归地调用拷贝构 造函数.因此拷贝构造函数的参数必须是一个引用   在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识. 但是如果我问你"拷贝构造函数的参数为什么必须使用引用类型?"这个问题, 你会怎么回答? 或许你会回答为了