C++知识点之构造函数

构造函数是什么?构造函数是C++类用来实例化对象的特殊成员函数。在C++中,当创造类的实例化对象的时候构造函数会被自动调用。和普通的成员函数相比,构造函数没有返回值,构造函数的函数名和类名一致。当程序没有指定构造函数的时候,编译器会自动合成无参的构造函数。C++大致有一下集中构造函数,默认构造函数,参数化构造函数,委托构造函数,拷贝构造函数,移动构造函数。
1:默认构造函数
在C++中,默认构造函数指的是一个能被无参调用(包含参数有默认值的函数)的函数,包括自己定义的默认构造函数和编译器合成的默认构造函数,例如在下面的代码中。

class Construct
{
    Construct(){}//默认构造函数
    Construct(int i=0,int j=0){}//默认构造函数
};

两个构造函数一个是无参的,一个是有参但是参数有默认值的,都是默认的构造函数。如果类的设计者没有写任何的构造函数,那么编译器一定会合成默认的构造函数吗?不是的,只有当编译器被需要的时候才会合成默认的构造函数。关于什么时候被需要,这里不展开写,总结起来就是调用对象成员或基类的默认构造函数或者 为对象初始化虚表指针与虚基类指针。
2:带参构造函数
带参数的构造函数可以用来初始化类的成员变量,例如下面的代码

class Construct
{
public:
    Construct(int i):num(i){}
public:
    int num;
};

当利用带参构造函数实例化对象的时候类的成员也被初始化了。
3:委托构造函数
在C++primer的定义中,一个委托构造函数使用它所属的类的其他构造函数执行自己的初始化过程,或者说它把自己的一些(或者全部)职责委托给了其他构造函数。一个委托构造函数应该有着最大数量的参数以构造出完整的对象。

class A
{
private:
    int a;
    int b;
    char c;
 public:
    A(int num1,int num2,int c1):a(num1),b(num2),c(c1){}
    A(int num1,char c1):A(num1,0,c1){}//委托上一个构造函数
    A(int num0):A(num0,''){}//委托上一个构造函数
};

注意,被委托的构造函数应该具有最大数量的参数。委托构造函数的作用是目的是简化构造函数的书写,提高代码的可维护性,避免代码冗余膨胀。
4:拷贝构造函数
拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。构造函数的原型是:

ClassName (const ClassName &old_obj);

下面是一个简单的拷贝构造函数的例子

class Point
{
private:
    int x;
    int y;
public:
    Point(int x1,int y1):x(x1),y(y1){}
    Point(const Point& p2)
    {
        x=p2.x;
        y=p2.y;
    }
    int getX()
    {
        return x;
    }
    int getY()
    {
        return y;
    }
};
int main(void) 
{ 
    Point p1(10,5);
    Point p2(p1);
    cout<

在该例子中用Point的实例化对象p1去初始化p2。那么在C++中,什么时候会调用拷贝构造函数呢?
在C++中,在以下4中情况下会调用拷贝构造函数:
1:当类的对象由值返回时。
2:当类的对象被当成参数传递给函数时
3:当一个对象基于相同类的另一个对象构造时。
4:当编译器产生一个临时对象时。
什么时候需要用户定义的拷贝构造函数?如果没有用户定义的拷贝构造函数,编译器通常会合成默认的拷贝构造函数用来在对象之间进行成员拷贝。当一个对象有指针或者任何运行时分配的资源例如文件句柄和网络连接的时候才需要用户定义的拷贝欸构造函数。编译器默认的合成拷贝构造函数通常是浅拷贝,只有用户定义的拷贝构造函数才是深拷贝。
5:拷贝与赋值运算符
拷贝构造发生在初始化对象的时候发生,如果对象已经初始化了,只是要给他一个新的值,那么即使赋值操作而不是拷贝操作来了,例如下面的例子

MyClass t1, t2; 
MyClass t3 = t1;  // ----> (1) 
t2 = t1;          // -----> (2)  

1是拷贝,2是赋值操作。下面通过一个例子说明拷贝构造函数为什么必须是引用类型;

class Point
{
private:
    int x;
    int y;
public:
    Point()
    {
        cout<<"构造对象"<

程序输出的结果是

构造对象
调用拷贝构造函数
调用拷贝构造函数
对象作为参数传递给函数

首先来分析一下Point(const Point& p2);和Point p2(p1);这句话,吐过不是传引用的话,那么他的 含义其实是

Point p2=p1;

由于p2并没有被构造出来,所以又会调用构造函数来进行构造造成程序无止境递归从而造成程序崩溃。
5:移动构造函数
参见https://www.jianshu.com/p/cb82c8b72c6b

你可能感兴趣的:(C++知识点之构造函数)