c++ 垃圾成员值,同时使用公共和私有重载构造函数

Posted

技术标签:

【中文标题】c++ 垃圾成员值,同时使用公共和私有重载构造函数【英文标题】:c++ garbage member values while using public and private overloaded constructors 【发布时间】:2017-11-29 16:12:05 【问题描述】:
#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): monthx, dayy, yearz 

    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 x11, 21;

    cout << x.month << endl;
    cout << x.day << endl;
    cout << x.year << endl;


正如您在上面的代码中看到的,我有两个构造函数,在 main 中我创建带有两个参数的对象 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); 不会像你认为的那样做。它创建一个新的、临时的date,在语句结束时被销毁。如果除了字符串之外还打印了this,加上cout,你会注意到它。 【参考方案1】:

构造函数没有名字也不能被调用。表达式date(x, y, 100); 使用私有构造函数创建一个临时实例,该实例立即被销毁。您可以委托构造,但您需要使用正确的constructor delegation syntax。要委托构造函数,您必须在初始化列表中这样做。它必须是初始化列表中的唯一元素。例如:

#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;

【讨论】:

请注意,输出将是"Hello you called me PRIVATE constructor",后跟"Hello you called me PUBLIC constructor"(与 OP 的预期输出相反的顺序)。【参考方案2】:

正如其他答案所说,构造函数不能正常直接调用;但是可以从其他构造函数中直接调用它们(在 c++11 中),但语法非常具体。

date::date(int x, int y):
      date(x, y, 100)

    cout << "Hello you called me PUBLIC constructor" << endl;

即它们必须作为初始化列表的一部分被调用。

请注意,这会以与您指定的顺序不同的顺序调用事物

【讨论】:

为什么和评论相反? @Slava 因为评论被删除了 @UKMonkey 这是我的评论。我删除了它,因为它与其他评论是多余的。不能直接调用构造函数。他们是无名的。严格来说,委托构造与调用构造函数不同,我想这就是它的样子。 @FrançoisAndrieux 你可以称之为新的安置......但我想我现在要在角落里哭了 @MarkRansom 这就是我所说的。这是 C++ 从其他语言中汲取的东西。这个线程讨论它***.com/questions/308276/…

以上是关于c++ 垃圾成员值,同时使用公共和私有重载构造函数的主要内容,如果未能解决你的问题,请参考以下文章

类的默认成员函数

C++历史

在c++中的继承,如何在子类中重载成员函数

重载赋值运算符

深浅拷贝,深浅赋值语句

C++ 中具有公共继承的虚函数和私有成员