构造函数的分类及调用

构造函数可以使用两种方式进行分类:

    按参数分为:无参构造和有参构造

    按类型分为:普通构造和拷贝构造

class Person
{
public:
    //无参构造(也可称为默认构造)
    Person()
    {
        cout << "Person的无参构造" << endl;
    }
    //有参构造
    Person(int a)
    {
        age = a;
        cout << "Person的有参构造" << endl;
    }
    //拷贝构造函数
    Person(const Person &p)
    {
        //将传入的人的属性全部拷贝到我的属性
        age = p.age;
        cout << "Person的拷贝构造" << endl;
    }
    int age;
};

构造函数的调用有三种方法:

 1:括号法

Person p1;//默认构造函数的调用
Person p2(10);//有参构造函数的调用
Person p3(p2);//拷贝构造函数的调用

注意事项:调用默认构造函数是不要加(),加上小括号后编译器会这是认为一个函数的声明。

2:显示法

Person p1;//默认构造函数的调用
Person p2=Person(10);//有参构造函数的调用
Person p3=Person(p2);//拷贝构造函数的调用

Person(10);为匿名对象,特点:当前执行结束后,系统会立刻回收匿名对象。

注意事项:不要用拷贝构造函数初始化匿名对象

3:隐式转换法

Person p2=10;//相当于 写了 Person p2=Person(10)  有参构造函数的调用
Person p3=p2;//拷贝构造函数的调用

拷贝构造函数的调用时机:

1.使用一个已经创建完的对象来初始化一个新对象

Person p1(10);
Person p2(p1);

2.值传递的方式给函数参数传值

3.以值方式返回局部对象

深拷贝和浅拷贝的问题:

浅拷贝:常见的赋值拷贝操作

如果用编译器提供的拷贝构造函数,会做浅拷贝操作。浅拷贝带来的问题是堆区的内存重复释放。

深拷贝:在堆区间重新申请空间,进行拷贝操作

原文地址:https://www.cnblogs.com/fei102461/p/12442202.html

时间: 2024-08-29 13:36:19

构造函数的分类及调用的相关文章

构造函数的分类及调用(2)

两种分类方式: 1.按参数分为:有参构造和无参构造(默认构造) 2.按类型分为:普通构造和拷贝构造 三种调用方式: 1.括号法 2.显示法 3.隐式转换法 匿名对象的特点:特点:当前行执行结束后,系统会立即回收掉匿名对象 1 #include <iostream> 2 using namespace std; 3 4 class Person 5 { 6 public: 7 //构造函数 8 Person() 9 { 10 cout << "Person默认构造函数的调用

c++学习笔记5,多重继承中派生类的构造函数与析构函数的调用顺序(二)

现在来测试一下在多重继承,虚继承,MI继承中虚继承中构造函数的调用情况. 先来测试一些普通的多重继承.其实这个是显而易见的. 测试代码: //测试多重继承中派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace std; class base { public: base() { cout<<"base created!"<<endl; }

C++C++中构造函数与析构函数的调用顺序

http://blog.csdn.net/xw13106209/article/details/6899370 1.参考文献 参考1: C++继承中构造函数.析构函数调用顺序及虚函数的动态绑定 参考2: 构造函数.拷贝构造函数和析构函数的的调用时刻及调用顺序 参考3: C++构造函数与析构函数的调用顺序 2.构造函数.析构函数与拷贝构造函数介绍 2.1构造函数 构造函数不能有返回值 缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空 创建一个对象

Effective C++ Item 09-绝不在构造函数和析构函数中调用virtual函数

Item 09-绝不在构造函数和析构函数中调用virtual函数(Never call virtual functions during construction or destruction) Why? 由于base class构造函数的执行更早于derived class构造函数,当base class构造函数执行derived class的成员变量尚未初始化.如果期间调用的virtual函数下降至derived class阶层,要知道derived class的函数几乎必然取用local成

C++构造函数的自动调用(调用一个父类的构造函数,有显性调用最好,否则就默认调用无参数的构造函数)——哲学思想:不调用怎么初始化父类的成员数据和VMT?

我总是记不住构造函数的特点,关键还是没有领会那个哲学思想:父类的构造函数一方面要初始化它自己的成员数据,另一方面也要建立它自己的VMT呀!心里默念一百遍:一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VM

【C/C++】构造函数与析构函数的调用顺序

常见问题 Q1. 以下代码的输出结果是什么? 1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 A() { cout << "A" << endl; } 8 ~A() { cout << "~A" << endl; } 9 }; 10 class B : public A 11 { 12 public: 13 B

拷贝构造函数和赋值运算符的调用情况

很多情况下,对于 如下的说明,很难接受 int a(10); 其实完全等价于int a=10; 所以下面的情况更加难以接受: class A;//定义class A 应用: A a; A b(a);//其实完全等价于A b=a,调用的都是拷贝构造函数,在所有人的眼中如果不是,非常熟悉这样赋值的方式,还真是看做是赋值运算. 例子如下: void Test(A a) { } 在这个函数中,通过值的传递,其实调用的是拷贝构造函数,而没有调用赋值运算符,或者默认的构造函数, class T { publ

C++中构造函数和析构函数的调用顺序

一般而言,析构函数调用的顺序和构造函数调用顺序相反,但是,对象的存储类别可以改变调用析构函数的顺序.举例说明: CreateAndDestroy类的定义 CreateAndDestroy类的成员函数的定义 测试函数 构造函数和析构函数的调用顺序: 分析 全局作用域内定义的对象的构造函数,在文件内任何其他函数(包括main函数)开始执行之前调用,当main函数执行结束时,相应的析构函数被调用,如上面的Object 1. exit函数迫使程序立即结束,不执行自动对象的析构函数.当程序中检测到输入中有

类继承时,构造函数和析构函数的调用次序

比如,apple类是fruit类的子类,当执行apple a("红富士");的时候,将先调用fruit类的构造函数,再调用apple类的构造函数 同理,假设在程序里先后声明了两个apple实例: apple a(“红富士"); apple b("青香蕉"); 当函数退出时,要先销毁b,再销毁a(因为b在栈顶). 而调用析构函数时,先调用apple的析构函数,再调用fruit的析构函数. 综上可见,构造函数和析构函数的调用次序恰好反了个个儿. Java和C+