我是c ++语言的新手,我对java语言很熟悉.
在Java世界中,代码看起来没问题,但在c ++中却没有.
有人可以解释为什么两个构造函数被调用?
class Position { public: Position(void) { std::cout<<"defualt constructor\n"; } Position(unsigned int row,unsigned int col) { std::cout<<"two Arguments constructor\n"; row_index = row; col_index = col; } private: unsigned int row_index; unsigned int col_index; }; class Tool { public: Tool(char Team,unsigned int row,unsigned int col) { pos = Position(row,col); team = Team; } std::string To_string() { std::string str = "team: "; str+= team; str+= " pos: "; str+= pos.To_string(); return str; } char Get_team() { return team; } private: Position pos; char team; // A or B }; int main(void) { Tool t = Tool('A',1,3); return 0; }
我打算调用两个参数构造函数
OUTPUT:
defualt构造函数
两个Arguments构造函数
在Tool
类中,Position
在执行Tool
构造函数体的执行之前,首先默认构造对象.然后创建一个新的临时Position
对象中的Tool
构造体,并用它来分配给pos
.
这里的重要部分是对象构建分为三个步骤:
对象已分配
初始化对象并构造其所有成员(此处Position
调用默认构造函数)
执行对象的构造函数(这里Position
调用双参数构造函数)
要仅使用双参数Position
构造函数,而不是简单地分配给pos
对象,您需要使用构造函数初始化列表.您可以通过修改Tool
构造函数来执行此操作:
Tool(char Team,unsigned int row,unsigned int col) : pos(row, col), // Initializes the `pos` object team(Team) // Initialize the `team` member { // No code needed, the members have already been initialized }