zoukankan      html  css  js  c++  java
  • c++的复制构造函数,(郑莉 c++语言程序设计)

    1.

    https://www.cnblogs.com/BlueTzar/articles/1223313.html

    以上博客讲了深拷贝和浅拷贝的区别,即:

    在某些状况下,类内成员变量需要动态开辟堆内存,这时实行拷贝

    B=A;

    A的成员指针变量有指向内存,这时复制构造函数会将B的也指向同一块内存,A销毁(比如析构)时,B里面的成员变量就成了野指针。所以默认的复制构造函数是不行的。这时就需要深拷贝。

    2.何种情况下自动调用复制构造函数

    1)对象以值的形式传递到函数时

    2)对象以值的形式作为函数的返回值时

    3)对象需以另一个对象进行初始化时,

    // 4_2.cpp: 定义控制台应用程序的入口点。
    //学习赋值构造函数的使用。有三种场景
    //1.对象复制时
    //2.函数的参数是对象,且是以值传递的形式时。
    //3.函数的返回值是对象。

    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    class Point
    {
    public:
    Point(int gX=1,int gY=2)//将此构造函数构造成内联构造函数
    {
    x = gX;
    y = gY;
    }
    Point(Point &a);
    int getX();
    int getY();
    private:
    int x, y;
    };

    Point::Point(Point &a)
    {
    x = a.x+10;
    y = a.y;
    cout << "haha" << endl;
    };
    int Point::getX()
    {
    return x;
    }
    int Point::getY()
    {
    return y;
    }

    //定义一个普通函数
    void func1(Point p)
    {
    cout << "func1's is " << p.getX() << endl;
    }

    //定义一个有返回值的函数
    Point func2()
    {
    Point p(3, 4);
    return p;//p是局部变量,调用结束就销毁。编译系统会创建一个临时对象,执行return时会调用复制构造函数a的值复制到临时对象去
    }

    int main()
    {
    Point p1;
    //cout << "p1x is: " << p1.getX() << " yis: " << p1.getY() << endl;//1 2
    Point p2 = p1;
    cout << "p2_x1 is: " << p2.getX() << " yis: " << p2.getY() << endl;//11 2//第一次调用复制,加了10
    p2 = func2();
    cout << "p2_x2 is: " << p2.getX() << " yis: " << p2.getY() << endl;//13 4//第二次调用复制,p2被重新赋值
    func1(p2); // 23//第三次,值传递形式拷贝对象,故会再次调用,得到的是p的x值,跟p2没什么关系。
    cout << "p2_x3 is: " << p2.getX() << " yis: " << p2.getY() << endl;//13 4
    system("pause");
    return 0;
    }

  • 相关阅读:
    mysql一个字段多个值如何分别取出这些值
    mysql json数组取值、查询
    mui删除元素
    软件测试的艺术(读书笔记1)
    爬虫(3)_网站分析
    谈谈作为测试的8年
    测试有前景吗?
    爬虫(二)-创建项目&应用
    爬虫(一)-环境搭建
    puppeteer UI自动化测试demo(一)
  • 原文地址:https://www.cnblogs.com/yyzyxy/p/9736141.html
Copyright © 2011-2022 走看看