C++重载的构造函数不能互相调用
程序员文章站
2022-07-10 23:17:46
java类里的重载构造函数可以互相调用,如下代码: 代码执行结果是: constructor1:TestConstructor@74a14482constructor2:TestConstructor@74a1448210TestConstructor@74a14482 可见结果是预期的,对valu ......
java类里的重载构造函数可以互相调用,如下代码:
1 public class TestConstructor { 2 private int value; 3 4 public TestConstructor(int value) { 5 this.value = value; 6 System.out.println("constructor1:"+this); 7 } 8 9 public TestConstructor() { 10 this(10); 11 System.out.println("constructor2:"+this); 12 } 13 14 public static void main(String[] args) { 15 TestConstructor test = new TestConstructor(); 16 System.out.println(test.value); 17 System.out.println(test); 18 } 19 }
代码执行结果是:
constructor1:TestConstructor@74a14482
constructor2:TestConstructor@74a14482
10
TestConstructor@74a14482
可见结果是预期的,对value赋值是成功的,且只创建了一个对象。
来看一下C++实现(头文件省略):
1 #include "testconstructor.h" 2 #include <QDebug> 3 4 TestConstructor::TestConstructor() 5 { 6 // this(10); 7 TestConstructor(10); 8 qDebug()<<"constructor1:"<<this; 9 } 10 11 TestConstructor::TestConstructor(int value) 12 { 13 this->value = value; 14 qDebug()<<"constructor2:"<<this; 15 }
1 #include "testconstructor.h" 2 #include <QDebug> 3 4 int main(int argc, char *argv[]) 5 { 6 TestConstructor *t = new TestConstructor(); 7 qDebug()<<t->value; 8 qDebug()<<t; 9 delete t; 10 }
代码执行结果是:
constructor2: 0x22fcf0
constructor1: 0xdadfb0
15574896
0xdadfb0
一方面,对value设置的值没有生效,另一方面,两个构造函数创建了两个不同的对象,说明C++不能像java那样构造函数之间互相调用。
解决方法:
大多数构造函数互相调用的需求应该是有默认参数,在C++的函数声明中可以直接设置默认传参(java不支持默认参数),这样就不需要构造函数重载了:
TestConstructor(int value = 10);
上一篇: 谷歌开发区块链相关技术
下一篇: 八个入门瑜伽动作 每天十分钟效果惊人
推荐阅读
-
C++学习笔记之调用构造函数和析构函数的顺序
-
C++中的赋值操作符重载和拷贝构造函数
-
4.C++中的函数重载,C++调用C代码,new/delete关键字,namespace(命名空间)
-
C++编写字符串类CNString,该类有默认构造函数、类的拷贝函数、类的析构函数及运算符重载
-
C++程序员应了解的那些事(36)Effective STL第6条:当心C++编译器中最烦人的分析机制 --- 调用构造函数被误认为是函数声明的问题
-
C#通过重载构造函数传递参数、实现两个窗体下的方法的互相调用
-
C++重载的构造函数不能互相调用
-
在C++中子类继承和调用父类的构造函数方法
-
C++ vector::erase和无参构造函数的调用(代码教程)
-
C++学习笔记之调用构造函数和析构函数的顺序