C++类中无默认构造函数的情况
构造函数的重载的判断条件是:参数的个数或者类型不同,其他要保持一样。
默认构造函数:在建立对象时候不必给出实参的构造函数,称为默认构造函数,显然,无参构造函数属于默认构造函数,一个类只能有一个默认构造函数,如果用户未定义构造函数,则系统会自动提供一个默认构造函数,但它的函数体是空的,不起初始化作用,如果用户希望在创建对象的时候就能使数据成员有初值,就必须自己定义构造函数。
一个类中可以包含多个构造函数,但是对于每个对象来说,建立对象只执行其中一个构造函数,并非每个构造函数都被执行。
在以下示例程序中, Human 类没有默认构造函数,因此创建 Human 对象时必须提供姓名和年龄:
#include <iostream>
#include <string>
using namespace std;class Human
{private:string name;int age;public:Human(string humansName /*= "Adam"*/, int humansAge /*= 25*/) {name = humansName;age = humansAge;cout << "Overloaded constructor creates " << name;cout << " of age " << age << endl;}void IntroduceSelf(){cout << "I am " + name << " and am ";cout << age << " years old" << endl;}
};int main()
{Human firstMan("Adam", 25); Human firstWoman("Eve", 28);firstMan.IntroduceSelf();firstWoman.IntroduceSelf();
}
输出:
Overloaded constructor creates Adam of age 25
Overloaded constructor creates Eve of age 28
I am Adam and am 25 years old
I am Eve and am 28 years old
分析:
这个版本的 Human 类只有一个构造函数,该构造函数接受一个 string 参数和一个 int 参数,如第 11行所示。没有默认构造函数,而在您提供了重载的构造函数时, C++编译器不会为您生成默认构造函数。 这个示例还表明, 可在创建 Human 对象时提供 name 和 age, 且以后不能修改它们。 这是因为 Human 类的 name 属性存储在私有变量 Human::name 中, main() 或其他不属于 Human 类成员的实体不能访问或修改它。换句话说,重载的构造函数要求 Human 类的用户创建每个对象时,都必须指定姓名(和年龄),且不能修改姓名,这与现实情况相当吻合,您说呢?您的姓名是父母在您出生时取的,别人可以知道,但任何人都无权修改(您自己除外)。
该文章会更新,欢迎大家批评指正。
推荐一个零声学院的C++服务器开发课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容
点击立即学习:C/C++后台高级服务器课程