您的位置:首页 > 其它

默认构造函数,隐式类型转换,复制构造函数

2014-02-26 09:31 169 查看
对于默认构造函数,大家的第一印象好像总是认为这样的,例如有一个类A

class A{

public:

A():a(0),b(2.09) {}

private:

int a ;

double b;

string str;

};


好像总以为默认构造函数都是形参表中没有形参的那种。但事实上还有一种默认构造函数他是有形参的,只不过其中的形参都带有默认实参。



class A{

public:

A(int c=0, double d=4.6):a(c),b(d) {}

private:

int a ;

double b;

string str;

};


这也是一个默认构造函数。默认构造函数可以自己定义,也可以靠编译器来合成。但是两者在应用中还是有不同用途的。

合成的默认构造函数初始化数据成员的原则是初始化变量的原则,即:类类型的数据成员通过调用其相应类的默认构造函数初始化,内置和复合类型的数据成员根据其定义的位置决定,在全局作用于定义的对象时才进行初始化,在局部作用于中定义的对象不作初始化,因此我们可以看到,当你的数据成员中含有内置类型或者复合类型时,最好自己定义一个默认构造函数,不要依靠编译器合成,那样会带来不必要的麻烦和限制了类的应用。自己定义的一个默认构造函数对内置类型和复合类型数据成员做初始化。还要注意,如果你定义了一个构造函数,不管是普通的还是默认的构造函数,编译器都不会在为你合成默认构造函数了。

隐式类类型转化

注意,在C++的类中,用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换。注意条件:“单个实参调用”

此处在实践中好像很混乱,请教了很多人好像此处的规定与不同版本的编译器有关,不是太专业,就不水了。抑制隐式转换可以使用explicit关键字。

假设你有一个函数

void foo( SmartInt n );

SmartInt 是你自己定义的一个类,他有一个构造函数类似这样

SmartInt::SmartInt( int n );

就是说,可以由一个Int型的数据,构造出一个SmartInt。

这时候,下面的语句就是合法的。

int a = 1;

foo( a );

C++会把 int 型先通过SmartInt的构造函数 构造出一个临时的SmartInt来调用这个函数。

如果C++没有这个特性,那像上面的调用就是非法

复制构造函数

复制构造函数是一种特殊的构造函数,它有单个形参,而且该形参是对该类类型本身的引用。

复制构造函数主要有以下几种用处:

1.根据同一个类型的对象显式或隐式的初始化另一个对象;

2.复制一个对象,用于传递实参;

3.函数返回一个类对象的时候;

4.初始化顺序容器中的元素;

5.根据元素初始化列表初始化数组元素。

复制构造函数的工作原理是:先使用指定的构造函数创建一个临时对象,然后调用复制构造函数将创建的临时对象复制到正在创建的对象上

如果不想用户代码复制该类类型的对象,应将复制构造函数显式声明为private
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: