常函数和常对象,箭头->、双冒号::、和点.的区别和友元类

本文介绍了C++中的常函数和常对象,常函数通过const修饰this指针防止对象状态改变,而常对象则是对象本身不可修改。接着讨论了箭头->、双冒号::和点.的区别,分别用于指针访问成员和作用域解析。最后讲解了友元类和友元函数的概念,强调了友元关系的单向性和非继承性,并给出了示例。
摘要由CSDN通过智能技术生成

常函数和常对象,箭头->、双冒号::、和点.的区别和友元类

文章转载至: 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 类名::函数名();

欢迎关注技术公众号,获取更多软件学习干货
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值