构造、拷贝构造、赋值

来源:互联网 发布:java调用浏览器下载 编辑:程序博客网 时间:2024/04/30 11:02

构造函数

注意:

  • 构造函数初始化列表的初始顺序,是根据类数据变量的声明顺序

拷贝构造函数

调用拷贝构造函数的三种情况:(先拷贝,在构造,整个过程叫拷贝构造)

  • 用一个对象创建另一个对象时候

  • 在调用函数时需要将实参对象内容传递给形参时候

  • 函数返回值是类对象时(而非引用或指针)

赋值

重载 =

三者放一起比较

#include <iostream>#include <string>class C1 {    std::string name;public:    C1(const std::string &name): name(name){        std::cout << "构造" << name << std::endl;    }    C1(const C1 &other): name(other.name) {        std::cout << "拷贝" << name << std::endl;    }    C1 operator =(const C1 &other) {        std::cout << "赋值" << name << std::endl;        return other; // 在此处调用拷贝。先利用other创建一个临时对象    }};void copy1(C1 &left, C1 &right) { // 这也是赋值过程,然而不是传内容,是传地址    std::cout << __func__ << std::endl;    left = right; // 调用赋值,参数是right,也是就是c2。利用赋值产生临时变量构造Left,整个过程叫拷贝构造,调用拷贝}void copy2(C1 left, C1 right) { //  相当于C1 left = c1, C2 right = c2,函数参数传递的过程就是赋值过程。拷贝    std::cout << __func__ << std::endl;    left = right;}C1 &copy3(C1 &right) {    std::cout << __func__ << std::endl;    return right; // 在此时调用拷贝,创建出一个临时对象}C1 copy4(C1 right) {    std::cout << __func__ << std::endl;    return right;}int main(int argc, const char * argv[]) {    C1 c1("c1");    C1 c2("c2");    copy1(c1,c2);    std::cout << "mark1" << std::endl;    copy2(c1, c2);    std::cout << "mark2" << std::endl;    C1 c3(copy3(c2)); // 先拷贝产生临时对象,然后构造c3,整个过程就是拷贝构造,调用一次拷贝构造函数//    C1 c3 = copy3(c2); 这2句是相同的,都是对c3的初始化。    std::cout << "mark3" << std::endl;    C1 c4 = copy4(c2);    return 0;}

函数参数传递的过程就是赋值过程。

1

C1 c1("c1");C1 c2("c2");

简单构造就不解释了
输出:
构造c1
构造c2

2

copy1(c1,c2);std::cout << "mark1" << std::endl;

输出:
copy1
赋值c1
拷贝c2
mark1

copy1()的形参是引用,在调用函数时候传入的实参也是赋值过程,不过赋值的是地址而不是内容,所以不调用拷贝构造。
left = right;调用赋值函数,参数是right,也是就是c2。然后利用赋值产生临时变量构造Left(然后自己被析构),整个过程叫拷贝构造,调用拷贝

3

copy2(c1, c2);std::cout << "mark2" << std::endl;

输出:
拷贝c1
拷贝c2
copy2
赋值c1
拷贝c2
mark2

copy2()的形参是普通的对象类型,因此调用拷贝构造函数构造局部变量left和right.相当于C1 left = c1; C1 right = c2;
其后语句同2

4

C1 c3(copy3(c2)); std::cout << "mark3" << std::endl;

输出:
copy3
拷贝c2
mark3

先拷贝产生临时对象(然后析构自己),然后构造c3(然后析构临时对象),整个过程就是拷贝构造,调用一次拷贝构造函数
(如果写出返回引用,目的是提高效率,不许要那么多拷贝和临时变量)
这句话也相当于 C1 c3 = copy3(c2); 都是对c3的初始化。

5

C1 c4 = copy4(c2);

输出:
拷贝c2
copy4
拷贝c2

不解释了。。。

0 0
原创粉丝点击