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

C++基本概念——构造函数

2016-02-21 15:29 225 查看

构造函数的概念

  为了让用户自定义类型能够像基本内置类型一样,能够被被方便地进行初始化,方便地进行声明、拷贝和赋值,C++定义了构造函数的概念。构造函数的任务是初始化类对象的数据成员,一旦类的对象被创建,构造函数就会自动被调用

构造函数的基本特点

  前面我们了解到构造函数的定义和作用,下面我们就接着讨论构造函数的一般特点,总结起来主要有五个

首先,构造函数名字和类的名字相同

其次,构造函数没有返回类型

构造函数的参数列表可能为空,也可以有多个

构造函数可以有多个,这一点和函数的重载也是一致的

构造函数不能被声明为const,这是因为我们在创建一个类的常量对象的时候,首先要给类的成员赋值之后,这个对象才能够具有常量的属性,若构造函数为const,那么就无法完成对象的构造,也就更谈不上让对象具有常量的属性。

常见的构造函数的种类

  按照构造函数的用途不同,可以对构造函数进行划分,包括默认构造函数,一般普通构造函数,拷贝构造函数,移动构造函数,转换构造函数和他们各自的合成版本。下面主要讨论这几种构造函数的特点,以及他们对应的编译器的合成版本。

1.默认构造函数

  类通过一个特殊的构造函数来控制默认初始化过程,这个函数叫做默认构造函数,默认构造函数是不需要任何实参的。例如,

class A{
private:
int a;
public:
A(){a=0;}//,默认构造函数,参数列表为空
};


  在类没有声明任何构造函数的时候,编译器会合成默认构造函数。但是我们应该尽量不要依靠编译器的这种特性,原因有三个:编译器只有在没有任何构造函数的时候才会合成;其次,合成的默认构造函数可能会进行一些未定义的行为,这就给程序的执行带来类隐患;如果类中的某个成员是一个没有定义默认构造函数的类的对象,那么编译器就不能为该类合成默认构造函数。

2.拷贝构造函数

  如果一个构造函数第一个参数是类自身的引用,且除此之外的参数都是默认值,那么这样的函数称为拷贝构造函数。例如,

class Foo{
Foo();//默认构造函数
Foo(const Foo&);//拷贝构造函数
//others
};


  如果我们没有定义构造函数,编译器会为我们合成一个构造函数,但是编译器的合成版本只是简单地将类的成员逐个的拷贝到正在创建的对象中,如果类的成员是内置类型则简单拷贝,如果类的成员是类类型则调用相应类的拷贝构造函数。

  拷贝构造函数的作用主要是进行拷贝初始化,那么在什么情况下拷贝构造函数会被调用呢?

使用=定义变量的时候。

将一个对象作为实参传递给一个非引用类型的形参。

从一个返回类型为非引用的函数返回一个类的对象。

用花括号列表初始化一个数组中元素。

  举个例子,我们观察下面的这段代码有几处调用了拷贝构造函数。注意,之列出代码的关键部分,省略了不必要的细节。

Point global;
Point foo_bar(Point arg){  //调用函数时,会调用一次拷贝构造函数
Point local=arg,    //=,调用
*heap=new Point(global);//类似于函数调用,需要调用一次
*heap=local; //=,调用
Point pa[4]={local,*heap};//数组初始化,调用一次
return *heap;  //返回是类的对象,调用
}


3.转换构造函数

  转换构造函数实际上是C++中的一种默认类型转换的机制,这种构造函数只定义了一个形参,可以发生从形参类型到类类型的转换,值得注意的是这种转换只允许进行一步。我们还是通过一个例子来理解,

class Sales_data{
public:
Sales_data()=default;
Sales_data(const string &s);//转换构造函数
Sales_data combine(const Sales_data&);
//类中其他成员
...
};
string book="C++";
Sales_data item;
item.combine(book);//正确,string转换为Sales_data
item.combine("C++");//错误,cosnt char*发生一步转换为string


  最后,补充一点,转换构造函数并不是百里而无一害的,在必要的时候我们还需要通过explict关键字来抑制这种隐式转换。尽管使用explicit关键字之后,编译器不会进行相关的隐式转换了,但是我们可以使用static_cast关键字进行强制类型转换。

总结

  注意,本文不是为了介绍语法细节,而更多是为了让你建立起对构造函数完整的认识。因此,想要想要了解更多关于构造函数的知识,建议阅读相关的语法书籍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: