[问题] 类别、建构子问题

楼主: amamoimi (佛仔)   2023-09-18 17:16:13
程式新手
前几天写了一个练习题拿去问chatgpt
#include <iostream>
using namespace std;
class Animal {
public:
string name;
Animal(string, string, int);
void print1();
protected:
string type;
int weight;
};
Animal::Animal(string n, string t, int w) {
name = n;
type = t;
weight = w;
}
void Animal::print1() {
cout << "name:" << name << " type:" << type << " weight:" << weight;
}
class Cat : public Animal {
public:
Cat(string, string, int, int, int);
void print2();
private:
int body_length;
int tail_length;
};
Cat::Cat(string n, string t, int w, int b, int a)
: Animal(n, t, w), body_length(b), tail_length(a) {}
void Cat::print2() {
print1();
cout << " body length:" << body_length << " tail length:" << tail_length;
}
class Human : public Animal {
public:
Human(string, string, int, int, string);
void print3();
Cat pet;
protected:
int height;
};
Human::Human(string n, string t, int w, int h, string p)
: Animal(n, t, w), height(h) {
pet = Cat(p, "black", 7, 30, 20);
}
void Human::print3() {
print1();
cout << " height:" << height << " pet:" << pet.name << endl;
}
int main() {
Human Betty("Betty", "Asian", 46, 160, "Kitty");
Betty.print3();
Betty.pet.print2();
return 0;
}
结果竟然没办法执行xdd
后来回复他后他又生了一个程式给我,基本上就是把黄字的部分改成
Human::Human(string n, string t, int w, int h, string p)
: Animal(n, t, w), height(h), pet(p, "black", 7, 30, 20) {}
这样
但是这两个有什么不同啊@@他解释给我听但是我听不懂....
但是这两个有什么不同啊@@他解释给我听但是我听不懂....
请教板上高手!
楼主: amamoimi (佛仔)   2023-09-18 17:29:00
蓝字部分不知道为什么会变蓝 请忽略@@
作者: nh60211as   2023-09-18 17:52:00
Cat 没有 default constructor,所以必须在member initialization list就初始化的样子错误讯息 https://i.imgur.com/XmbhsYq.png
楼主: amamoimi (佛仔)   2023-09-18 19:54:00
嗯嗯我有去run过 不过为什么不能在human constructor的brace里初始化呀?
作者: mihonisizumi (中原岬マジ天使)   2023-09-18 20:18:00
可参考 Initialization order 的部分https://tinyurl.com/36mvy7e8在第三步骤提到 data member 会在 constructor 的body 前被初始化https://pastebin.com/pDCBK8vU 这份code有加了一个没参数的 cat constructor 就可以通过编译 而且从输出可以看到 constructor 执行的顺序
楼主: amamoimi (佛仔)   2023-09-18 20:43:00
谢谢大大我觉得我越来越不懂了...那这个code的pet用的是default constructor 还是我自己写的建构子啊?@@
作者: jack7775kimo (阿庞)   2023-09-18 20:51:00
写一些std::cout的指令在你自己的constructors中让你知道compiler呼叫谁
楼主: amamoimi (佛仔)   2023-09-18 21:30:00
m大给的那个code 我想说的是 如果assign不能算初始化那pet用的应该是default constructor 但是他之后又assign我设的建构子给pet 那最后pet到底是用什么建构子..?
作者: mihonisizumi (中原岬マジ天使)   2023-09-18 21:33:00
可参考 explanation 中 effect 的第一点https://tinyurl.com/5n7yu67y由于data member在constructor body前就会被初始但由于没有提供任何初始化参数 compiler会使用无参数的constructor 在你原本的 Cat 中因为额外定义了constructor 所以编译器不会自动帮你产生 defaultconstructor 可参考:https://tinyurl.com/bdh9jcb5在我后来贴的code中 明确定义无参数的constructor后在Human在初始时 会先呼叫无参数的 Cat constructor进到 body 后再呼叫有参数的 constructor可参考执行截图:https://i.imgur.com/0ErYJcw.pnghttps://pastebin.com/sspJe3mv 稍微修改cout部分
作者: LPH66 (-6.2598534e+18f)   2023-09-18 22:00:00
补充一个: 进 body 后技术上是有参数的 ctor 建构暂时物件再使用复制指定 (或移动指定) 运算子把暂时物件放进 pet 里在指定过去之后这个暂时物件会被销毁, 这里会呼叫解构子这其实跟一个普通的 Cat 变量被指定一个 Cat(...) 的过程是一模一样的, 这并不是初始化而是一个新物件盖过去写在 : 那行里的才是真正对 pet 变量代表的物件呼叫建构子这个基本上就是 C++ 语法这么规定, 你写在那里才是建构子
作者: mihonisizumi (中原岬マジ天使)   2023-09-18 22:13:00
楼上大大讲的内容执行起来大概会是这样https://pastebin.com/FswErZhDhttps://i.imgur.com/nXSPfhR.png可以观察内存位置了解技术上是怎么运作
楼主: amamoimi (佛仔)   2023-09-19 18:07:00
我看的书好像没有讲到rhs...我该换本书吗==不过我应该懂我问的问题了...总之如果没有在initialization list里用我的建构子初始化pet,他就会自动使用default constructor对吧?问题是我没有设定无引数的建构子所以程式不能执行..

Links booklink

Contact Us: admin [ a t ] ucptt.com