常函数和常对象,箭头->、双冒号::、和点.的区别和友元类
文章转载至: http://blog.bools.cn/archives/1623
一、常函数和常对象
概念:常函数一般存在在类里面,就是在普通函数后面添加一个const来修饰this指针,目的就是为了不让this指向本体对象的值修改。(但是如果在变量前加上mutable关键字则可以修改)。
void change()const//常函数,修饰this指针,表明当前当前对象相应的值不可以改变
{
cout << "m_age" << m_age << endl;
this->m_bge = 10;
cout << "m_bge" << m_bge << endl;
}
int m_age = 0;
mutable int m_bge = 1;
};
常对象就是在命名对象的后面添加const,目的就是不准修改本体函数属性。
const Person p2;
实例:
#include<iostream>
using namespace std;
class Person
{
public:
void change()const//常函数,修饰this指针,表明当前当前对象相应的值不可以改变
{
cout << "m_age" << m_age << endl;
this->m_bge = 10;
cout << "m_bge" << m_bge << endl;
}
int m_age = 0;
mutable int m_bge = 1;
};
void test04()
{
Person p1;
p1.change();
const Person p2;
}
int main()
{
test04();
system("pause");
return 0;
}
结果就是m_bge得到了修改,m_age值不可以修改。
注意:
1、如果定义了常函数仍要修改变量就是加上mutable
2、常对象只能调用常函数,就能调用个普通函数。
二、箭头->、双冒号::、和点.的区别
例子:
class Struct {
int member_a;
};
1、当使用指针指向时:
Struct*p;
p->member_a=1;
2、当创建对象的时候:
Struct p;
p. member_a=1;
3、**:😗*只用在类成员函数和类成员变量中。比如,声明一个类:
class CA {
public:
int ca_var;
int add(int a, int b);
int add(int a);
};
那么在实现这个函数时,必须这样书写:
int CA::add(int a, int b)
{
return a + b;
}
类名做数据类型*
类名+星号表示创建一个类的指针对象。类名是一种特殊的类型名,在定义变量的时候和int等简单数据类型基本一样
*Person Person就是定义了一个Person接口类的指针对象,只是起了个名称,具体使用时需要new创建一个接口对象
就是利用的时候要加上:Person*Person=new Person;
三、类作为友元类
定义:类作为友元类就是在被访问类里面加上friend class+类名。
注意:
1、友元关系不能继承。
2、友元关系是单向的,类A是类B的好朋友,但是类B不一定是类A的好朋友。
3、友元关系不具有传递性,类B的类A的好朋友,类C是类B的好朋友,但是类C不一定是类A的好朋友。
实例:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include <string>
using namespace std;
class goodGay
{
public:
goodGay();
void visit();
private:
Building* building;
};
class Building
{
//让好基友类 作为 Building的好朋友
friend class goodGay;
public:
Building();
public:
string m_SittingRoom; //客厅
private:
string m_BedRoom; //卧室
};
Building::Building()
{
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
goodGay::goodGay()
{
building = new Building;
}
void goodGay::visit()
{
cout << "好基友正在访问: " << this->building->m_SittingRoom << endl;
cout << "好基友正在访问: " << this->building->m_BedRoom << endl;
}
void test01()
{
goodGay gg;
gg.visit();
}
int main() {
test01();
system("pause");
return EXIT_SUCCESS;
}
结果就是:
好基友正在访问卧室
好基友正在访问客厅
四、成员函数作为友元函数
定义格式:
friend void 类名::函数名();
欢迎关注技术公众号,获取更多软件学习干货