问题在最底下
笔记复习
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;
}
疑问
我写的成员函数做友元为什么不对?