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++ 垃圾成员值,同时使用公共和私有重载构造函数的主要内容,如果未能解决你的问题,请参考以下文章