C++学习日记---第17天(大佬们帮我看看问题出哪了)

问题在最底下


笔记复习

1.const在类中的运用

const在类中可以用来修饰成员变量、成员函数和对象

1)const修饰成员变量

a.const修饰普通成员变量

const修饰成员变量时常量成员变量必须在创建对象时被初始化,并且只能在初始化列表中被初始化,不能在函数体中被初始化

#include<iostream>
using namespace std;

class person {
public:
	const int value;
	person(int value) {
		this->value=value;
	}
};

int main() {
	person p1(10);
	return 0;
}

这个代码会报错

正确代码为:

#include<iostream>
using namespace std;

class person {
public:
	const int value;
	person(int value):value(value) {
//第一个value指的是构造函数的形参,第二个value指的是常量成员变量,第三个value指的是构造函数的形参
	}
};

int main() {
	person p1(10);
	return 0;
}
b.修饰静态成员变量

静态成员可以直接在类内初始化(仅限整型),如果是非整型(如double)需要在类外定义并初始化

#include<iostream>
using namespace std;

class person {
public:
	static const int value=10;
};

int main() {
	return 0;
}

当我们在类内初始化double类型的静态常量成员时就会报错

正确的做法是在类外定义并初始化,类内仅仅是声明,告诉编译器有这样一个静态常量成员存在

#include<iostream>
using namespace std;

class person {
public:
	static const double value;
};

const double person::value = 3.1415926;

int main() {
	return 0;
}

 2)const修饰成员函数(间接作用于成员变量)

语法:在正常函数的定义中,在参数列表和函数体语句中间加上const

被const修饰的成员函数我们称为常函数,常函数内不可以修改成员属性

但加上mutable关键字后我们可以在const函数中修改成员变量

mutable常用于那些在逻辑上被视为常量,但需要被修改的成员变量)

#include<iostream>
using namespace std;

class person {
public:
	void showage(int age)const {
		m_age = age;
	}
	mutable int m_age;
};

int main() {
	person p;
	p.showage(10);
	return 0;
}

3)const修饰对象

语法:const 类名 对象名;

被const修饰的对象称为常对象,常对象只能调用常函数

 常对象拥有的成员变量无法被修改

 同样的,使用mutable可以使常对象的成员变量被修改,这里不再举例。

2.友元函数

生活中你的家有客厅(public),有你的卧室(private)
客厅中所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去
但是呢,你也可以允许你的好闺蜜好基友进去
在程序里,有些私有属性,不想要暴露出来,但却想让类外特殊的一些函数或者类进行访问,这就需要用到友元的技术

一个函数成为友元函数后,它就拥有访问该类所有成员的权限,无论是private还是protected。但它并不是该类的成员函数,所以它不可以使用类的this指针,也不属于类的对象。
友元的目的就是让一个函数或者类访问另一个类中的私有成员(private)或保护成员(protected)
友元的关键词为friend
友元的三种实现
全局函数做友元
类做友元
成员函数做友元

1)全局函数做友元

友元函数声明的语法就是在类中,在正常函数声明前加上friend关键字

#include<iostream>
#include<string>
using namespace std;

class Building {
	//在Building类中声明goodgay全局函数是Building的好朋友,可以访问Building中的私有成员
	friend void goodgay(Building* building);
public:
	Building() {
		m_sittingroom = "客厅";
		m_bedroom = "卧室";
	}
	string m_sittingroom;//客厅
private:
	string m_bedroom;//卧室
};

//全局函数
void goodgay(Building*building) {
	cout << "好基友全局函数正在访问:" << building->m_sittingroom << endl;
	cout << "好基友全局函数正在访问:" << building->m_bedroom << endl;//未声明前无法访问,会报错
}

void test01() {
	Building building;
	goodgay(&building);
}

int main() {
	test01();


	system("pause");
	return 0;
}

2)类做友元

首先,我们需要知道类中访问另一个类一共有两层,一层是类能够访问另一个类的公共成员,另一层是类能够访问另一个类保护成员和私有成员

a.类访问其他类的公有成员

这一步是基础,如果没有这一步,后面访问私有成员的操作也无法实现

#include<iostream>
using namespace std;

class home {
public:
	int baoxiangui(int income) {
		cash += income;
		return cash;
	}
private:
	int cash = 10000;
};

class thief {
public:
	home* yaoshi;
//在thief类中创建一个home类型的指针,访问类home的对象必须有这步操作
//但仅仅只有这步操作还不够,此时baoxiangui是一个空指针
	thief() {
		yaoshi = new home();//动态创建home对象,这行代码必须先有home定义之后才能写
		//如果没有这段代码,那么baoxaingui是一个空指针,后续无法用来访问home类的成员
	}
};

int main() {
	thief t1;
	cout<<t1.baoxiangui->baoxiangui(4500);
	return 0;
}

 C++中不允许在类外部访问私有成员和保护成员,必须通过公有方法和友元类来访问,这里实际上就用到了公有方法,利用home类中的一个公有函数访问home类中的私有成员

b.访问其他类的保护成员和私有成员
#include<iostream>
using namespace std;

class thief;

class home {
	friend class thief;
public:
	int baoxiangui(int income) {
		cash += income;
		return cash;
	}
private:
	int cash = 10000;
};

class thief {
public:
	home* yaoshi;
	thief() {
		yaoshi = new home();//动态创建home对象,这行代码必须先有home定义之后才能写
		//如果没有这段代码,那么baoxaingui是一个空指针,后续无法用来访问home类的成员
//上面的创建home类型指针和动态创建home对象是类访问其他类的成员的基础
	}
	void showcash() {
		cout << yaoshi->cash << endl;
	}
};

int main() {
	thief t1;
	t1.showcash();
	return 0;
}

3)类的成员函数做友元

错误代码示例:

#include<iostream>
using namespace std;

class king;

class civilians {
	friend void king::wife();
private:
	int deposit = 10000;
};

class king {
public:
	civilians* power = new civilians();
	void wife() {
		cout << power->deposit;
//这里是无法访问deposit的
//我们不能直接用指针访问私有成员,需要借助对方的公共函数
	}
};

int main() {
	king k;
	k.wife();
	delete k.power;
	return 0;
}

本人研究良久,不知道自己代码错哪里了,GPT,通义,kimi都问过了,给出的代码写进跟我一模一样但是还是会报错,下面给出我的代码,各位大神有时间的话帮我看看。

#include<iostream>
using namespace std;

class civilians;

class king {
public:
	civilians* power = new civilians();
	void wife() {
		cout << power->jiezhi();
	}
};

class civilians {
	friend void king::wife();
public:
	int jiezhi() {
		return deposit;
	}
private:
	int deposit = 10000;
};

int main() {
	king k;
	k.wife();
	delete k.power;
	return 0;
}

疑问

我写的成员函数做友元为什么不对?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值