类与对象
一、const修饰成员函数
用const修饰的成员函数,const修饰this指针指向的内存区域,成员函数体内不可以修改本类中的任何普通成员变量,当成员变量类型符用mutable修饰时例外。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Data{ private: int data; mutable int num; public: Data(){ cout<<"无参构造"<<endl; } Data(int data){ this->data = data; cout<<"有参构造"<<endl; } Data(Data const &ob){ cout<<"拷贝构造"<<endl; } ~Data(){ cout<<"析构函数"<<endl; } void myfun() const { num = 1000; } };
|
运行结果:
二、const修饰对象(常对象)
常对象只能调用const的成员函数,常对象可访问const或非const数据成员,不能修改,除非成员用mutable修饰
一般const修饰对象与const修饰成员函数配合使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| class Data{ private: int data; mutable int num; public: int data1; mutable int num1; public: Data(){ cout<<"无参构造"<<endl; data1 = 10; num1 = 20; } Data(int data){ this->data = data; cout<<"有参构造"<<endl; } Data(Data const &ob){ cout<<"拷贝构造"<<endl; } ~Data(){ cout<<"析构函数"<<endl; } void myfun() const { num = 1000; } void myfun1(){
} void myfun2() const{
}
};
void test01(){ const Data ob1; cout<<ob1.data1<<endl; cout<<ob1.num1<<endl; ob1.num1 = 200;
cout<<ob1.data1<<endl; cout<<ob1.num1<<endl;
cout<<"-------------------"<<endl;
ob1.myfun2(); }
|
运行结果:
三、友元
类的主要特点之一是数据隐藏,即类的私有成员无法在类的外部访问,但是有时候需要在类的外部访问类的私有成员而不借助公有的函数,怎么办呢?解决办法是使用友元函数,友元函数是一种特权函数,C++允许这个特权函数访问私有成员。这一点从现实生活中也可以很好的理解:比如你的家,有客厅,有你的卧室,那么你的客厅是public的,所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去,但是呢,你也可以允许你的闺蜜好基友进去。程序员可以把一个全局函数、某个类中的成员函数、甚至整个类声明为友元。
友元语法:
friend
关键字只出现在声明处,其他类、类成员函数、全局函数都可声明为友元,友元函数不是类的成员,不带this
指针,友元函数可访问对象任意成员属性,包括私有属性。
将全局函数在类中加friend关键字声明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Room{ friend void goodFoundationFriends(Room &ob); private: string livingRoom; string bedRoom; public: Room(){ livingRoom = "客厅"; bedRoom = "卧室"; } }; void goodFoundationFriends(Room &ob){ cout<<"好基友访问了"<<ob.livingRoom<<endl; cout<<"好基友访问了"<<ob.bedRoom<<endl; }
int main(int argc, char *argv[]) { Room ob1; goodFoundationFriends(ob1); return 0; }
|
运行结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #include <iostream>
using namespace std; class Room; class GoodFriends{ public:
void visit1(Room &ob); };
class Room{ friend void GoodFriends::visit1(Room &ob); private: string livingRoom; string bedRoom; public: Room(){ livingRoom = "客厅"; bedRoom = "卧室"; } }; void GoodFriends::visit1(Room &ob){ cout<<"好朋友访问了你的"<<ob.livingRoom<<endl; cout<<"好朋友访问了你的"<<ob.bedRoom<<endl; } int main(int argc, char *argv[]) { Room ob1; GoodFriends ob2; ob2.visit1(ob1); return 0; }
|
运行结果:
即一个类的所有函数都可以访问另一个类的私有数据
这个时候可以在上面类的成员函数作为另一个类的友元
的基础上,将友元声明部分修改成类的友元就行,或者将两个类调换顺序,将Room类放在GoodFriends类的前面。对GoodFriends类在Room之前进行一下声明就行,但是好像不声明也不会报错。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #include <iostream>
using namespace std; class GoodFriends; class Room{ friend class GoodFriends; private: string livingRoom; string bedRoom; public: Room(){ livingRoom = "客厅"; bedRoom = "卧室"; } };
class GoodFriends{ public: void visit1(Room &ob){ cout<<"好朋友访问了你的"<<ob.livingRoom<<endl; cout<<"好朋友访问了你的"<<ob.bedRoom<<endl; } }; int main(int argc, char *argv[]) { Room ob1; GoodFriends ob2; ob2.visit1(ob1); return 0; }
|