您的位置:首页 > 编程语言 > C语言/C++

关于C++ 构造函数的那点小事

2013-10-10 10:00 169 查看
先列出来c++中所有的构造函数

1、默认构造函数和带参数的构造函数 我们暂且称他们为“普通构造函数” .eg Test(); or Test(int i, ...);

2、拷贝构造函数Test(const Test & t);

3、类型转换构造函数  Test(int i);

一、普通构造函数

1、这里我们主要讲一下默认构造函数的生命周期:即它什么时候会出现?

答:通常在一个类中,如果我们没有给出任何类型的构造函数,那么这个默认的构造函数就会由编译器自动生成。

         反之,如果程序员给出了任何一种类型的构造函数,那么编译器是不会为我们生成默认构造函数的(这一点适用于所有构造函数)

看下面这个例子:

#include <iostream>

using namespace std;

class Test
{
public:
Test(int iCounter);
private:
int m_iCounter;
};

Test :: Test(int iCounter)
{
m_iCounter = iCounter;
}

int main()
{
Test test;
return 0;
}


由于在类体中,我们给出了一种类型的构造函数,那么编译器就不会再帮助我们自动生成默认构造函数了,所以在main函数中,我们想要通过调用默认构造函数的方式来创建一个对象是错误的:对‘Test::Test()’的调用没有匹配的函数

2、改变:

(1)如果我们把普通构造函数放到private里面,会产生什么效果?

二、拷贝构造函数

顾名思义,拷贝构造函数就是当你打算用一个已经存在的对象,去找葫芦画瓢再创建一个对象时,新对象调用的构造函数.

1、细节

(1)我们做一些有意思的改变:如果我们把拷贝构造函数设置成私有的会怎么样?

eg:

class Test
{
public:
Test();
private:
Test(const Test & t);
};


在main函数中,我们这样使用:

int main()
{
Test t;
Test t2 = t;

return 0;
}


编译,报错:‘Test::Test(const Test&)’是私有的

是了,我们在类外部,用对象t去拷贝构造t2,这个时候,t2会调用拷贝构造函数,而拷贝构造函数是私有的,在类外部调用是非法的。

所以,把拷贝构造函数设置成私有的效果就是,在类外部不能进行对象的拷贝

三、类型转换构造函数、

1、细节:

(1)通常有且只有一个参数的构造函数是类型转换构造函数,但有一个参数的构造函数也可以不是类型转换构造函数,eg:可以是普通构造函数,甚至拷贝构造函数都是只有一个构造函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: