c++创建对象时一些小细节

发布时间:2025-12-09 12:03:19 浏览次数:1

1. 父类型指针 a = new 子类型; delete a时,父/子类的构造/析构函数时如何调用的?

直接看下面例子:

 1 #include <memory> 2 #include <iostream> 3  4 using namespace std; 5  6 class BF{ 7     public: 8         BF(){ cout << "base::base()\n";fun();} 9         virtual ~BF(){cout << "~base::base()\n";fun();}10         virtual void fun(){cout << "base::fun() virtual\n";}11 };12 13 class derive: public BF14 {1517 public:18     derive(){cout << "derive::derive()\n";fun();}19     ~derive(){cout << "~derive::derive()\n";fun();}20     virtual void fun(){cout << "derive::fun() virtual\n";}21 };22 23 int main()24 {25     cout << "-------------------" << endl;26     BF *b = new BF();27     delete b;28     cout << "-------------------" << endl;29     derive *d = new derive();30     delete d;31     cout << "-------------------" << endl;32     BF *bd = new derive();33     delete bd;34     return 0;35     36 }

运行结果:

-------------------
base::base()
base::fun() virtual
~base::base()
base::fun() virtual
-------------------
base::base()
base::fun() virtual
derive::derive()
derive::fun() virtual
~derive::derive()
derive::fun() virtual
~base::base()
base::fun() virtual
-------------------
base::base()
base::fun() virtual
derive::derive()
derive::fun() virtual
~derive::derive()
derive::fun() virtual
~base::base()
base::fun() virtual

结论: 类型A指针 a = new 类型B 时,无论类型A如何,都是调用类型B的构造函数来初始化,delete a时也是调用类型B的析构函数

2. C++创建类对象时(无参)后不加括号与加括号的区别(参考:https://www.cnblogs.com/traeyee/p/4892410.html)

直接看例子:

 1 #include<iostream> 2 using namespace std; 3  4 class C{ 5 public: 6     C(){ 7         cout<<"Hello C++\n"; 8     }; 9     C(int m){10         cout<<"I love C++\n";11     };12 private:13     int n;14 };15 16 int main(){17     cout << "-------get parameter------" << endl;18     C a(1);19     cout << "-------get ()------" << endl;20     C b();21     cout << "-------nothing------" << endl;22     C c;23     return 0;24 }

运行结果:

-------get parameter------
I love C++
-------get ()------
-------nothing------
Hello C++

结论:

给参数时,调用相应的构造函数,在栈内存中实例化对象;

只有一个括号时……这尼玛是声明了一个返回该类对象的函数;

啥都没有只有对象名时,调用默认构造函数(如果没有定义默认构造函数则出错)。

3. C++中 new 一个对象 时加括号和不加括号的区别

 1 #include<iostream> 2 using namespace std; 3  4 class C{ 5 public: 6     C(){ 7         cout<<"Hello C++\n"; 8     }; 9     C(int m){10         cout<<"I love C++\n";11     };12 private:13     int n;14 };15 16 int main(){17     cout << "-------get parameter------" << endl;18     C* a = new C(1);19     cout << "-------get ()------" << endl;20     C* b = new C();21     cout << "-------nothing------" << endl;22     C* c = new C;23     return 0;24 }

运行结果:

-------get parameter------
I love C++
-------get ()------
Hello C++
-------nothing------
Hello C++

结论:

传入参数时,会调用相应的构造函数;没有参数时,无论是否加括号,都会调用默认构造函数

C自己对象的过程细节
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477