鱼C论坛

 找回密码
 立即注册
查看: 991|回复: 12

[已解决]关于C++构造器和析构器的几个问题求助

[复制链接]
发表于 2019-12-5 10:00:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
问题1,如下代码
  1. #include <iostream>
  2. using namespace std;
  3. class A{
  4. public:
  5.     A(){cout<<'x';}
  6. };

  7. class B:public A{
  8. private:
  9.     int x;
  10. public:
  11.     B(int x):A(),x(x){cout<<x<<'t';}
  12. };

  13. class C{
  14. private:
  15.     A a;
  16.     B b;
  17. public:
  18.     C(int x):b(x){cout<<'r';}
  19. };
  20. void f(){
  21.     A a1;
  22.     B b1(2);
  23.     C c1(3);

  24. }
  25. int main() {
  26.     cout<<"bienvenue!\n";
  27.     f();
  28.     cout<<"au revoire!\n";
  29. }
复制代码


输出为:
  1. bienvenue!
  2. xx2txx3trau revoire!

  3. Process finished with exit code 0
复制代码

我想问对象a1输出x 对象b1输出x2t,对象c1输出xx3tr,我就想问开始的两个“xx”是从哪来的,为啥我自己写的只有一个x呢?

问题2:如下代码
  1. #include <iostream>
  2. using namespace std;
  3. class A{
  4. public:
  5.     A(){cout<<'a';}
  6.     ~A(){cout<<"b\n";}
  7. };

  8. class B:public A{
  9. private:
  10.     int x;
  11. public:
  12.     B(int x):A(),x(x){cout<<'c'<<x;}
  13.     ~B(){cout<<"~B"<<x;}
  14. };
  15. class C{
  16. private:
  17.     A a;
  18.     B b;
  19. public:
  20.     C(int x):b(x){cout<<'d';}
  21.     ~C(){cout<<'e';}
  22. };
  23. void f(){
  24.     A a1;
  25.     B b1(2);
  26.     C c1(3);
  27. }
  28. int main() {
  29.     cout<<"hello\n";
  30.     f();
  31.     cout<<"goodbye\n";
  32. }
复制代码

输出结果为:
  1. hello
  2. aac2aac3de~B3b
  3. b
  4. ~B2b
  5. b
  6. goodbye

  7. Process finished with exit code 0
复制代码


我想问我开始写出来的和输出结果完全不一样,请问有大神可以细致讲解下这个每一步的构造和析构过程吗,谢谢~!


问题3:如下代码
  1. #include <iostream>
  2. using namespace std;
  3. class A{
  4. public:
  5.     void f(){cout<<"hello!";}
  6. };

  7. int max(int *p,int n){
  8.     int max=p[0];
  9.     for(int i=1;i<n;i++){
  10.         if(max<p[i]){
  11.             max=p[i];
  12.         }
  13.         return max;
  14.     }

  15.     void fillMax(int *p,int n){
  16.         int max=max(*p,n);
  17.         for(int i=0;i<n;i++){
  18.             *p++=max;
  19.         }
  20.     }
  21. }
  22. int main() {
  23.     A a1;
  24.     A a2();
  25.     A *p;
  26.     const A a3;
  27.     p=&a1;
  28.     //p=&a3; illegal, a3 is const;
  29.     const A *q;
  30.     q=&a1;
  31.     //A *const r; r can not change, must be initialized??????????????
  32.     a1.f();
  33.     p->f();//(*p).f()
  34.     (*p).f();
  35.     //a2.f(); illegal
  36.     //q->f(); illegal q is a pointer to const, f is not const;
  37.     return 0;
  38. }
复制代码


我想问一下A *const r;   const A r;   A const *r;   const A *r; A const r 有啥区别呢,在实现p->f()的时候分别有哪些结果呢?
A *const r; r can not change, must be initialized??????????????这一句为啥要初始化,const A * q; A  const *q就不用初始化呢?
最佳答案
2019-12-5 13:38:21
  1. #include <iostream>

  2. class A
  3. {
  4. public:
  5.         int x;
  6.         A(): x(0) {}
  7.         void f()
  8.         {
  9.                 std::cout << "hello!" << std::endl;
  10.         }
  11. };

  12. int main()
  13. {
  14.         A a1;
  15.         A a2;

  16.         A *const r = &a1;        // 变量r是一个指针,这个const用来限制变量r,r只能在初始化的时候指向一个对象,之后就一直指向这个对象并且不能再指向其他对象
  17.         r->x = 100;                // 可以
  18.         r->f();                        // 可以
  19.         //r = &a2;                // 不可以

  20.         return 0;
  21. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-5 13:22:50 | 显示全部楼层
  1. #include <iostream>
  2. using namespace std;
  3. class A {
  4. public:
  5.         A() { cout << "class A的构造函数被调用" << std::endl; }
  6. };

  7. class B:public A {
  8. private:
  9.         int x;
  10. public:
  11.         B(int x):A(), x(x) { cout << x << " " << "class B的构造函数被调用" << std::endl; }
  12. };

  13. class C {
  14. private:
  15.         A a;
  16.         B b;
  17. public:
  18.         C(int x):b(x) { cout << "class C的构造函数被调用" << std::endl; }
  19. };
  20. void f() {
  21.         std::cout << "开始创建a1" << std::endl;
  22.         A a1;
  23.         std::cout << "a1创建完成,开始创建b1" << std::endl;
  24.         B b1(2);
  25.         std::cout << "b1创建完成,开始创建c1" << std::endl;
  26.         C c1(3);
  27.         std::cout << "c1创建完成" << std::endl;

  28. }
  29. int main() {
  30.         cout << "bienvenue!\n";
  31.         f();
  32.         cout << "au revoire!\n";
  33. }
复制代码

  1. bienvenue!
  2. 开始创建a1
  3. class A的构造函数被调用
  4. a1创建完成,开始创建b1
  5. class A的构造函数被调用
  6. 2 class B的构造函数被调用
  7. b1创建完成,开始创建c1
  8. class A的构造函数被调用
  9. class A的构造函数被调用
  10. 3 class B的构造函数被调用
  11. class C的构造函数被调用
  12. c1创建完成
  13. au revoire!
  14. 请按任意键继续. . .
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 13:28:37 | 显示全部楼层
问题2和问题1类似,多加几个cout然后再看输出结果,看看能不能看懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 13:31:08 | 显示全部楼层
第3个问题不太好回答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 13:38:21 | 显示全部楼层    本楼为最佳答案   
  1. #include <iostream>

  2. class A
  3. {
  4. public:
  5.         int x;
  6.         A(): x(0) {}
  7.         void f()
  8.         {
  9.                 std::cout << "hello!" << std::endl;
  10.         }
  11. };

  12. int main()
  13. {
  14.         A a1;
  15.         A a2;

  16.         A *const r = &a1;        // 变量r是一个指针,这个const用来限制变量r,r只能在初始化的时候指向一个对象,之后就一直指向这个对象并且不能再指向其他对象
  17.         r->x = 100;                // 可以
  18.         r->f();                        // 可以
  19.         //r = &a2;                // 不可以

  20.         return 0;
  21. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 13:42:51 | 显示全部楼层
  1. #include <iostream>

  2. class A
  3. {
  4. public:
  5.         int x;
  6.         A(): x(0) {}
  7.         void f()
  8.         {
  9.                 std::cout << "hello!" << std::endl;
  10.         }
  11. };

  12. int main()
  13. {
  14.         A a1;
  15.         A a2;

  16.         // 这两个是一样的
  17.         // A const r;
  18.         // const A r;

  19.         const A r;        // 变量r是一个对象,一个const对象
  20.         //r.f();        // 不可以,没错,确实是不可以因为函数f不是const的
  21.         //r.x = 100;        // 不可以

  22.         return 0;
  23. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 13:44:36 | 显示全部楼层
  1. #include <iostream>

  2. class A
  3. {
  4. public:
  5.         int x;
  6.         A(): x(0) {}
  7.         void f() const                // 这里添加const,指明函数f是const的
  8.         {
  9.                 //x = 1;        // 不可以,因为f是const的
  10.                 std::cout << "hello!" << std::endl;
  11.         }
  12. };

  13. int main()
  14. {
  15.         A a1;
  16.         A a2;

  17.         // 这两个是一样的
  18.         // A const r;
  19.         // const A r;

  20.         const A r;        // 变量r是一个对象,一个const对象
  21.         r.f();        // 可以
  22.         //r.x = 100;        // 不可以

  23.         return 0;
  24. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 13:45:30 | 显示全部楼层
剩下的晚上回来继续
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 13:51:00 | 显示全部楼层
本帖最后由 人造人 于 2019-12-5 13:59 编辑

还有时间,继续

  1. #include <iostream>

  2. class A
  3. {
  4. public:
  5.         int x;
  6.         A(): x(0) {}
  7.         void f()
  8.         {
  9.                 std::cout << "hello!" << std::endl;
  10.         }
  11. };

  12. int main()
  13. {
  14.         A a1;
  15.         A a2;

  16.         // 下面这两个是一样的
  17.         //A const *r;
  18.         //const A *r;

  19.         // 我比较喜欢写成这样,写成 A const *r;也完全可以
  20.         const A *r = &a1;        // 变量r是一个指针,这个指针指向的对象是const的
  21.         //r->f();                // 不可以
  22.         //r->x = 100;        // 不可以

  23.         r = &a2;        // 可以
  24.         //r->f();        // 不可以
  25.         //r->x = 100;        // 不可以

  26.         return 0;
  27. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 13:52:03 | 显示全部楼层
本帖最后由 人造人 于 2019-12-5 13:58 编辑
  1. #include <iostream>

  2. class A
  3. {
  4. public:
  5.         int x;
  6.         A(): x(0) {}
  7.         void f() const
  8.         {
  9.                 std::cout << "hello!" << std::endl;
  10.         }
  11. };

  12. int main()
  13. {
  14.         A a1;
  15.         A a2;

  16.         // 下面这两个是一样的
  17.         //A const *r;
  18.         //const A *r;

  19.         // 我比较喜欢写成这样,写成 A const *r;也完全可以
  20.         const A *r = &a1;        // 变量r是一个指针,这个指针指向的对象是const的
  21.         r->f();                // 可以
  22.         //r->x = 100;        // 不可以

  23.         r = &a2;        // 可以
  24.         r->f();                // 可以
  25.         //r->x = 100;        // 不可以

  26.         return 0;
  27. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 13:52:57 | 显示全部楼层
本帖最后由 人造人 于 2019-12-5 13:58 编辑
  1. #include <iostream>

  2. class A
  3. {
  4. public:
  5.         int x;
  6.         A(): x(0) {}
  7.         void f() const
  8.         {
  9.                 std::cout << "hello!" << std::endl;
  10.         }
  11. };

  12. int main()
  13. {
  14.         A a1;
  15.         A a2;

  16.         // 下面这两个是一样的
  17.         //A const *r;
  18.         //const A *r;

  19.         // 我比较喜欢写成这样,写成 A const *r;也完全可以
  20.         const A *r;        // 变量r是一个指针,这个指针指向的对象是const的
  21.         r = &a1;        // 可以在这里初始化
  22.         r->f();                // 可以
  23.         //r->x = 100;        // 不可以

  24.         r = &a2;        // 可以
  25.         r->f();                // 可以
  26.         //r->x = 100;        // 不可以

  27.         return 0;
  28. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 13:59:32 | 显示全部楼层
应该没有错别字了
^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-5 21:37:39 | 显示全部楼层
人造人 发表于 2019-12-5 13:59
应该没有错别字了
^_^

谢谢大神啦~~!我一会去图书馆好好看看呢~!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 12:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表