C 垃圾成员值时使用公共和私人超载构造函数

c++ garbage member values while using public and private overloaded constructors

本文关键字:构造函数 超载 成员      更新时间:2023-10-16
#include <iostream>
using namespace std;
class date{
    public:
        int month;
        int day;
        int year;
    private:
        date(int x, int y, int z);
    public:
        date(int x, int y);
};
date::date(int x, int y, int z): month{x}, day{y}, year{z} {
    cout << "Hello you called me PRIVATE constructor" << endl;
} 
date::date(int x, int y){
    cout << "Hello you called me PUBLIC constructor" << endl;
    date(x, y, 100);
}

int main(){
    date x{11, 21};
    cout << x.month << endl;
    cout << x.day << endl;
    cout << x.year << endl;
}

您可以在上面的代码中看到,我有两个构造函数,在主要我创建两个参数的对象x中。

这应该致电公共构造商,该公共构造者又致电私人构造函数并初始化公共成员的月份和年度。

但是当我打印成员值时,我没有得到所需的结果。

Hello you called me PUBLIC constructor
Hello you called me PRIVATE constructor
392622664
1
0

输出应为:

Hello you called me PUBLIC constructor
Hello you called me PRIVATE constructor
11
21
100

我不知道我在哪里做错了什么。任何帮助将不胜感激。谢谢。

构造函数没有名称,也无法调用。表达式date(x, y, 100);使用私有构造函数创建一个临时实例,该实例立即被破坏。您 can 委托构造,但您需要使用适当的构造委员会语法。要委派构造函数,您必须在初始化列表中这样做。它必须是初始化列表中的唯一元素。例如:

#include <iostream>
using namespace std;
class date {
public:
    int month;
    int day;
    int year;
private:
    date(int x, int y, int z);
public:
    date(int x, int y);
};
date::date(int x, int y, int z) : month{ x }, day{ y }, year{ z } {
    cout << "Hello you called me PRIVATE constructor" << endl;
}
date::date(int x, int y) : date(x, y, 100) {
    cout << "Hello you called me PUBLIC constructor" << endl;
}

int main() {
    date x{ 11, 21 };
    cout << x.month << endl;
    cout << x.day << endl;
    cout << x.year << endl;
}

作为其他答案状态,无法直接调用构造函数;但是,它们可以直接从其他构造函数(在C 11开始)中直接调用,但是语法非常具体。

date::date(int x, int y):
      date(x, y, 100)
{
    cout << "Hello you called me PUBLIC constructor" << endl;
}

ie必须称它们为初始列表的一部分。

请注意,这将以与您指定的不同顺序称为