黑马c++ P120 关于类内指针与构造函数的相关bug

首先是正确代码,接下来将在正确代码基础上进行修改:

//一个小技巧:类外声明函数最好最后写
#include<iostream>
using namespace std;

class building;

class person {
public:
	person();
	void visit();
private:
	building* b;
};

class building {
	friend void person::visit();
public:
	building();
	string bedroom;
private:
	string sittingroom;
};

person::person(){
	b = new building;
}

building::building() {
	//这里发现了一个小bug分析,具体见下文
	string bedroom = "卧室";
	sittingroom = "客厅";
}

void person::visit() {
	cout << "正在拜访: " << b->bedroom << endl;
	cout << "正在拜访: " << b->sittingroom << endl;
}

void test01() {
	person p;
	p.visit();
}
int main() {
	test01();
}

bug1:

注释掉24-26行,即构造函数未写出操作,但在类内写了函数调用

person::person(){
	b = new building;
}

 

bug2:

注释掉第九行的构造函数调用,同时继续注释掉24-26行

class person {
public:
	//person();
	void visit();
private:
	building* b;
};

//person::person(){
//	b = new building;
//}

可以成功运行,但输出结果只有第一次cout的正在拜访

 

猜测原因:

1.b指针指向不定,野指针b

2.cout的链式结构,一处结束,全部结束     (猜测,不确定)

bug3:  第二十九行的小bug

对第二十八行到三十二行进行更改,对三十行的bedroom加上string类型声明

building::building() {
	//这里发现了一个小bug分析
	string bedroom = "卧室";
	sittingroom = "客厅";
}

可以正常运行,但被string类型修饰的变量无法输出其储存的值

 原因分析:在函数内声明后,bedroom变成了与该函数同时存在的临时变量,与类内的bedroom不同了,但sittingroom不会收到影响,由于未给临时变量bedroom赋值,故控制台无法显示输出值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值