C++类中无默认构造函数的情况

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++后台高级服务器课程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C++不存在默认构造函数是指在定义一个C++类时,如果没有显式地声明或定义默认构造函数,那么编译器就不会为该类生成默认构造函数默认构造函数是一个没有任何参数的构造函数,它负责在创建对象时,给对象的成员变量初始化。当我们没有定义任何构造函数时,编译器会默认生成一个默认构造函数。但是,如果我们在类中显式定义了任何其他构造函数,编译器就不会再生成默认构造函数了。 当一个类没有默认构造函数时,我们在创建对象时必须显式地调用有参构造函数来进行对象的初始化。如果我们没有定义有参构造函数,那么编译器会报错,因为它无法自动创建默认构造函数。 为什么C++不存在默认构造函数呢?这是因为C++允许我们在定义类时通过构造函数对对象进行初始化,这样可以确保对象的合法性和一致性。但是,如果自动生成默认构造函数,那么对象就会使用默认值进行初始化,可能会导致对象的成员变量处于一个不合理的状态,进而引发错误。 为了避免这种错误,C++规定没有显式定义或声明默认构造函数的类,是无法使用默认构造函数的。因此,我们必须显式地定义或声明一个有参构造函数来对对象进行初始化。这样可以保证对象始终处于一个合理的状态,提高程序的稳定性和安全性。 ### 回答2: C++类如果没有显式声明构造函数,编译器会为其生成一个默认构造函数。然而,如果类中有一些特殊的成员、基类或者虚函数,编译器就无法生成默认构造函数。 当类中存在有以下情况时,编译器无法生成默认构造函数: 1. 类的成员或基类没有默认构造函数:如果类的成员或者基类没有默认构造函数,编译器无法通过自动生成的默认构造函数来初始化这些成员或者基类,因此无法生成默认构造函数。 2. 类定义了带参数的构造函数:如果类中定义了任何构造函数(不论是默认参数构造函数还是重载的构造函数),编译器会认为你提供的构造函数相对于默认构造函数更为重要,所以不会再为类生成默认构造函数。 3. 类定义了虚函数:当类中定义了虚函数时,编译器无法自动生成默认构造函数,因为默认构造函数无法初始化虚函数的相关信息(例如虚函数表)。 为了解决类没有默认构造函数的问题,可以手动为类编写一个构造函数来完成初始化工作,或者使用初始化列表来初始化类的成员或基类。总之,在需要使用默认构造函数的地方,我们需要手动为类提供一个默认构造函数,而不是依赖于编译器的默认构造函数。 ### 回答3: C++中,类不存在默认构造函数的意思是,在定义一个类时,如果没有显式地定义构造函数,那么编译器不会自动生成默认的构造函数。 构造函数是用来初始化对象的特殊成员函数,它会在对象创建时自动调用。当我们没有为类定义任何构造函数时,编译器会自动生成一个默认构造函数。 然而,当我们显式地定义了一个或多个构造函数时,编译器就不会再自动生成默认构造函数了。这就是所谓的“类不存在默认构造函数”。 如果我们需要创建一个没有默认构造函数的类的对象,我们就必须显式地定义自己的构造函数,以确保对象可以被正确地初始化。否则,在实例化该类对象时将会产生编译错误。 值得注意的是,当定义了至少一个自定义构造函数后,如果我们还想要使用默认构造函数,则需要手动显式地定义一个默认构造函数。 例如,下面是一个没有默认构造函数的类例子: ```cpp class MyClass { public: MyClass(int value) { // 构造函数的实现 } }; ``` 在这个例子中,我们定义了一个名为MyClass的类,它只有一个带有一个整型参数的构造函数。因此,如果我们在没有提供参数的情况下实例化MyClass的对象,将会出现编译错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值