[C++11] 默认构造函数

类通过一个特殊的构造函数来控制默认初始化过程,这个函数就是默认构造函数,默认构造函数无需任何实参。我们可以显示的定义默认构造函数也可以让编译器为我们生成默认构造函数。默认构造函数以如下规则初始化累的数据成员:

  • 如果存在类内初始值,用它来初始化成员。
  • 否则,默认初始化该成员。

class Sales_data {
public:
	std::string bookNo;
	unsigned units_sold = 0;
	double revenue = 0.0;
};

如上所示,因为Sales_data为units_sold和revenue提供了初始值,所以合成默认构造函数将使用这些值来初始化对应的成员,而bookNo被默认初始化为一个空字符串。

合成默认构造函数只适用于非常简单的类,通常来说,我们需要为自定义类提供默认构造函数,因为:

  • 编译器只有在发现类不包含任何构造函数的情况下才会替我们生成默认构造函数。一旦我们定义了一些其它的构造函数,除非我们再定义一个默认构造函数,否则这个类将没有默认构造函数。因为一个类在某种情况下需要控制对象初始化,那么该类可能需要在所有情况下都控制初始化。
  • 合成的默认构造函数可能执行错误的操作,比如对复合类型(数组和指针),默认初始化的结果是未定义的。
  • 有的编译器不能为某些类合成默认构造函数,比如类中包含一个其它类类型的成员,且这个成员的类型没有默认构造函数。

default关键字:

class Sales_data {
public:
	Sales_data() = default;
	Sales_data(const std::string &s) bookNo(s) {}
	Sales_data(const std::string &s, unsigned n, double p) :
		bookNo(s), units_sold(n), revenu(p*n) {}
	Sales_data(std::istream &);

	std::string isbn() const { return bookNo; }
	Sales_data& combine(const Sales_data&);
	double avg_price() const;
private:
	std::string bookNo;
	unsigned units_sold = 0;
	double revenue = 0.0;
};

在C++11标准中,如果我们需要默认的行为,可以通过在参数列表后来要求编译器生成默认构造函数。default既可以和声明一起出现在类的内部,也可以作为定义出现在类的外部。如果=default在类的内部,则默认构造函数是内联的,如果它在类的外部,则该成员函数默认情况下不是内联的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-29 09:50:39

[C++11] 默认构造函数的相关文章

【C/C++】构造函数、默认构造函数、成员初始化列表

常见问题 Q1. 下列关于构造函数的描述中,错误的是( ) A. 构造函数可以设置默认的参数 B. 构造函数在定义类对象时自动执行 C. 构造函数可以是内联函数 D. 构造函数不可以重载 Q2. 下列代码中a.b的各个成员变量值是多少? 1 class Student 2 { 3 public: 4 Student() {} 5 void show(); 6 private: 7 string name; 8 int number; 9 int score; 10 }; 11 Student a

error C2512: “Name”: 没有合适的默认构造函数可用

error C2512: “Name”: 没有合适的默认构造函数可用 1 #include <iostream> 2 #include <string> 3 #include <cmath> 4 using namespace std; 5 6 class Name 7 { 8 public: 9 Name (char *fst,char * last ); 10 //Name (){}; 11 string GetName() const ; 12 void setN

C++的默认构造函数与构造函数

今天看书,忽然发现自己对默认构造函数/构造函数的理解很模糊,在实际项目中写类时,这些细节问题并没有涉及到.因此,就专门对着<C++ Primer Plus>将默认构造函数/构造函数这一块简单总结一下. 构造函数:C++用于构建类的新对象时需要调用的函数,该函数无返回类型!(注意:是“无”! 不是空!(void)). 默认构造函数:未提供显式初始值时,用来穿件对象的构造函数. 以上是二者的定义,但是单从定义很难对二者进行区别,下面依然看代码. 1 class testClass 2 { 3 pu

C++中默认构造函数中数据成员的初始化

构造函数的任务是初始化数据成员的,在类中,如果没有显示定义任何构造函数,编译器将为我们创建一个构造函数,称为合成的默认构造函数,合成的默认构造函数使用与变量初始化相同的规则来初始化成员.即当类中的数据成员没有在构造函数中显示初始化,将执行默认初始化: 1.对于内置类型(如int,double,char,bool等)和复合类型(数组,指针),定义任何函数体之外的内置类型或复合类型变量将被初始化0,对于函数体内的内置类型的对象,若没有初始化,其值是未定义的. 2.具有类类型的成员通过运行各自的默认构

构造函数——默认构造函数

每个类分别定义了他的对象被初始化的方式,这些控制其对象初始化的成员函数就叫构造函数. 和其他函数的区别是:1.构造函数没有返回值.2.不能被声明成const,因为创建一个const对象时,知道构造函数完成初始化的过程,对象才能真正取得其“const“属性,所以构造函数在const对象的构造过程中是可以向其写值的. 当一个类没有定义构造函数的时候,编译器会隐式的合成一个构造函数,称为“合成的默认构造函数”.初始化顺序是先用类内的初始值初始化他,没有初始值的话执行默认初始化.注意只有在没有定义任何构

定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Complex(int i,int j) 显示复数的方法:showComp()将其显示为如: 5+8i或5-8i 的形式。 求两个复数的和的方法:(参数是两个复数类对象,返回值是复数类对象)public Complex addComp(Compl

因标题框有限,题目未显示完整,以下再放一份: 定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Complex(int i,int j) 显示复数的方法:showComp()将其显示为如: 5+8i或5-8i 的形式. 求两个复数的和的方法:(参数是两个复数类对象,返回值是复数类对象)public Complex addComp(Complex C1,Complex C2) 求两个复数的差的方法:(参数

【C++ Primer 第七章】 默认构造函数的作用

默认构造函数的作用 1.  默认构造函数 C++ 默认构造函数是对类中的参数提供默认值的构造函数,一般情况下,是一个没有参数值的空函数,也可以提供一些的默认值的构造函数,如果用户没有定义构造函数,那么编译器会给类提供一个默认的构造函数,但是只要用户自定义了任意一个构造函数,那么编译器就不会提供默认的构造函数,这种情况下,容易编译报错,所以正确的写法就是用户在定义构造函数的时候,也需要添加一个默认的构造函数,这样就不会造成编译报错. 如:用户自定义的默认构造函数 class Test { publ

c++11 继承构造函数

若基类拥有数量众多的不同版本的构造函数,而派生类中只有一些成员函数,则对于派生类而言,其构造函数就等同于构造基类. struct A { A(int i) {} A(double d, int i) {} A(float f, int i, const char* c) {} //... }; struct B : A { B(int i): A(i) {} B(double d, int i): A(d, i) {} B(float f, int i, const char* c): A(f,

c++11的构造函数继承

https://en.cppreference.com/w/cpp/language/using_declaration 在[Inheriting constructors]这一节. 其实叫做"基类的构造函数前置"比较好. 像mystring继承自string类,但仍然是提供字符串功能.new的时候仍旧希望保留旧有的初始化传参方式.这时候在mystring里一一再实现(调用基类)就比较麻烦. 但在c++11之前只能这样. c++11之前的默认构造方式(淡然c++11之后还是)是,先把各个基类的默