首页  

c++构造函数     所属分类 c 浏览量 785
构造函数是一种特殊的类成员函数
创建对象时自动调用构造函数来初始化对象 

构造函数名与类名相同
没有返回值
可重载,但创建对象时只会调用其中的一个

普通构造函数

拷贝构造函数 复制构造函数
类名(const 类名& 对象名)
A(const A& obj)
拷贝构造函数是一种特殊的构造函数
在创建对象时,使用同一类中之前创建的对象来初始化新创建的对象 
通过使用另一个同类型的对象来初始化新创建的对象
复制对象把它作为参数传递给函数
复制对象,并从函数返回这个对象

拷贝构造函数 如果在类中没有定义拷贝构造函数,编译器会自动生成
拷贝操作是浅拷贝!!!


如果类带有指针变量,并有动态内存分配,则必须有一个拷贝构造函数
相应的赋值运算符也需要重载
否则会重复释放内存

对象拷贝和赋值的区别

对象的赋值是对一个已经存在的对象进行重新赋值,因此必须先定义被赋值的对象,才能进行赋值
而对象的拷贝是在从无到有建立一个新对象,并使这个新对象和已有对象完全相同

A a1(1);
A a2(2);
// 对象赋值 调用 operator=运算符重载
a2 = a1;
// 对象拷贝 调用复制构造函数
A a3 = a2;
A a4{a2};

默认赋值操作符,会对每一个成员逐一赋值 , 类似浅拷贝



https://gitee.com/dyyx/hellocode/blob/master/web/tech/cpp/demo/construct001.cpp #include "iostream" class A{ public : int value; }; class B{ public : int value; B(){ std::cout << "B() run " << this << std::endl; value=1; } B(int value):value(value){ std::cout << "B(int) run" << std::endl; } B(const B& obj){ std::cout << "B copy construct run" << std::endl; value = obj.value; } B& operator =(const B& obj){ std::cout << "B = run" << std::endl; if (this != &obj){ this->value = obj.value; } return *this; } ~B(){ std::cout << "~B() run" << std::endl; } }; class C{ public : // int* p=new int(0); int* p=NULL; C(){ p = new int(1); std::cout << "C() run " << this << std::endl; // *p=1; } C(int value):C(){ *p = value; std::cout << "C(int) run" << std::endl; } C(const C& obj):C(){ std::cout << "C copy construct run" << std::endl; *p = *(obj.p); } C& operator =(const C& obj){ std::cout << "C = run" << std::endl; if (this != &obj){ *p = *(obj.p); } return *this; } ~C(){ free(p); std::cout << "~C() run" << std::endl; } }; // g++ -std=c++11 int main(){ A a1; // 不赋值 值不确定 a1.value = 1; std::cout << a1.value << std::endl; A a2{a1}; std::cout << a2.value << std::endl; A a3 = a2; std::cout << a3.value << std::endl; A a4; a4 = a2; std::cout << a4.value << std::endl; // B b1; std::cout << b1.value << std::endl; B b2{b1}; std::cout << b2.value << std::endl; B b3 = b2; std::cout << b3.value << std::endl; B b4; b4 = b2; std::cout << b4.value << std::endl; // C c1; std::cout << *(c1.p) << std::endl; C c2{c1}; std::cout << *(c2.p) << std::endl; C c3 = c2; std::cout << *(c3.p) << std::endl; C c4; c4 = c2; std::cout << *(c4.p) << std::endl; return 0; }

上一篇     下一篇
c++ 初始化列表

C++ 花括号和括号初始化的区别

C++面向对象知识点

C++ this 指针

c语言中常见的内存错误

c++运算符优先级和结合性