鱼C论坛

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

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

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

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

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

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

class B:public A{
private:
    int x;
public:
    B(int x):A(),x(x){cout<<x<<'t';}
};

class C{
private:
    A a;
    B b;
public:
    C(int x):b(x){cout<<'r';}
};
void f(){
    A a1;
    B b1(2);
    C c1(3);

}
int main() {
    cout<<"bienvenue!\n";
    f();
    cout<<"au revoire!\n";
}

输出为:
bienvenue!
xx2txx3trau revoire!

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

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

class B:public A{
private:
    int x;
public:
    B(int x):A(),x(x){cout<<'c'<<x;}
    ~B(){cout<<"~B"<<x;}
};
class C{
private:
    A a;
    B b;
public:
    C(int x):b(x){cout<<'d';}
    ~C(){cout<<'e';}
};
void f(){
    A a1;
    B b1(2);
    C c1(3);
}
int main() {
    cout<<"hello\n";
    f();
    cout<<"goodbye\n";
}
输出结果为:
hello
aac2aac3de~B3b
b
~B2b
b
goodbye

Process finished with exit code 0

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


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

int max(int *p,int n){
    int max=p[0];
    for(int i=1;i<n;i++){
        if(max<p[i]){
            max=p[i];
        }
        return max;
    }

    void fillMax(int *p,int n){
        int max=max(*p,n);
        for(int i=0;i<n;i++){
            *p++=max;
        }
    }
}
int main() {
    A a1;
    A a2();
    A *p;
    const A a3;
    p=&a1;
    //p=&a3; illegal, a3 is const;
    const A *q;
    q=&a1;
    //A *const r; r can not change, must be initialized??????????????
    a1.f();
    p->f();//(*p).f()
    (*p).f();
    //a2.f(); illegal
    //q->f(); illegal q is a pointer to const, f is not const;
    return 0;
}

我想问一下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
#include <iostream>

class A
{
public:
        int x;
        A(): x(0) {}
        void f()
        {
                std::cout << "hello!" << std::endl;
        }
};

int main()
{
        A a1;
        A a2;

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

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

使用道具 举报

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

class B:public A {
private:
        int x;
public:
        B(int x):A(), x(x) { cout << x << " " << "class B的构造函数被调用" << std::endl; }
};

class C {
private:
        A a;
        B b;
public:
        C(int x):b(x) { cout << "class C的构造函数被调用" << std::endl; }
};
void f() {
        std::cout << "开始创建a1" << std::endl;
        A a1;
        std::cout << "a1创建完成,开始创建b1" << std::endl;
        B b1(2);
        std::cout << "b1创建完成,开始创建c1" << std::endl;
        C c1(3);
        std::cout << "c1创建完成" << std::endl;

}
int main() {
        cout << "bienvenue!\n";
        f();
        cout << "au revoire!\n";
}
bienvenue!
开始创建a1
class A的构造函数被调用
a1创建完成,开始创建b1
class A的构造函数被调用
2 class B的构造函数被调用
b1创建完成,开始创建c1
class A的构造函数被调用
class A的构造函数被调用
3 class B的构造函数被调用
class C的构造函数被调用
c1创建完成
au revoire!
请按任意键继续. . .
想知道小甲鱼最近在做啥?请访问 -> 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 | 显示全部楼层    本楼为最佳答案   
#include <iostream>

class A
{
public:
        int x;
        A(): x(0) {}
        void f()
        {
                std::cout << "hello!" << std::endl;
        }
};

int main()
{
        A a1;
        A a2;

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

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

使用道具 举报

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

class A
{
public:
        int x;
        A(): x(0) {}
        void f()
        {
                std::cout << "hello!" << std::endl;
        }
};

int main()
{
        A a1;
        A a2;

        // 这两个是一样的
        // A const r;
        // const A r;

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

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

使用道具 举报

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

class A
{
public:
        int x;
        A(): x(0) {}
        void f() const                // 这里添加const,指明函数f是const的
        {
                //x = 1;        // 不可以,因为f是const的
                std::cout << "hello!" << std::endl;
        }
};

int main()
{
        A a1;
        A a2;

        // 这两个是一样的
        // A const r;
        // const A r;

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

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

使用道具 举报

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

使用道具 举报

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

还有时间,继续
#include <iostream>

class A
{
public:
        int x;
        A(): x(0) {}
        void f()
        {
                std::cout << "hello!" << std::endl;
        }
};

int main()
{
        A a1;
        A a2;

        // 下面这两个是一样的
        //A const *r;
        //const A *r;

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

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

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

使用道具 举报

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

class A
{
public:
        int x;
        A(): x(0) {}
        void f() const
        {
                std::cout << "hello!" << std::endl;
        }
};

int main()
{
        A a1;
        A a2;

        // 下面这两个是一样的
        //A const *r;
        //const A *r;

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

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

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

使用道具 举报

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

class A
{
public:
        int x;
        A(): x(0) {}
        void f() const
        {
                std::cout << "hello!" << std::endl;
        }
};

int main()
{
        A a1;
        A a2;

        // 下面这两个是一样的
        //A const *r;
        //const A *r;

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

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

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> 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, 2025-1-16 11:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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