C++特殊成员

C++特殊成员



提示:以下是本篇文章正文内容,下面案例可供参考

一、const成员

1.const数据成

  • const类型变量是不可以修改的
  • 必须采用初始化参数列表方式进行初始化
#include <iostream>
#include <string>
using namespace std;

class Stu
{
public:
	Stu(string name, int num) :num(num)
	{
		Stu::name = name;	//可以用,也可以不用初始化列表
		//stu::num = 1001;	必须要用初始化参数列表的方法初始化
	}
	void print()
	{
		//num = 1001;	只读,不能修改
		cout << name << "  " << num << endl;
	}
protected:
	string name;
	const int num;	//const数据成员

};
int main()
{
	Stu lisi("lisi", 18);
	lisi.print();
	while (1);
	return 0;
}

运行结果:
在这里插入图片描述

2.const成员函数

  • 写法上,const写在函数后面
  • 常成员函数是不能够修改数据成员,制度数据成员
  • 常曾元函数可以与普通函数同时存在
    普通函数和常成员函数相同时,普通对象优先调用普通函数
    普通对象可以调用常成员函数

3.const对象:const修饰的对象

  • 常对象只能调用常成员函数
#include <iostream>
#include <string>
using namespace std;

class Stu
{
public:
	Stu(string name, int num) :num(num)
	{
		Stu::name = name;	//可以用,也可以不用初始化列表
		//stu::num = 1001;	必须要用初始化参数列表的方法初始化
	}
	void printData()
	{
		cout << name << "\t" << num << endl;
	}
	void print()
	{
		//num = 1001;	只读,不能修改
		cout << name << "  " << num << endl;
	}
	//常成员函数
	void print()const
	{
		// name = "修改"; 错误 常成员函数不能修改数据
		// num =199 ;
		cout << name << "\t" << num<<endl;
		cout << "常成员函数" << endl;

	}
protected:
	string name;
	const int num;	//const数据成员
};
int main()
{
	Stu lisi("lisi", 18);
	lisi.print();			//普通对象调用普通函数
	const Stu zhangsan("常对象",20);	//常对象调用常成员函数
	zhangsan.print();
	//zhangsan.printData();		错误!常对象只能调用普通函数
	while (1);						
	return 0;
}

运行结果:
在这里插入图片描述

二、static成员

 **static成员它是不属于对象,是属于类的,意味着是所有对象共有的,调用可以不需要对象,
 当然你可以用对象调用,static成员依旧受权限限定。**

1.static数据成员

  • 必须在类外初始化,类外初始化不再需要static修饰,但是需要类名限定
  • 类中初始化是错误的,不能采用初始化参数列表方式初始化
#include <iostream>
#include <string>
using namespace std;

class STU
{
public:
	STU(string name, int num) :name(name)
	{

	}
protected:
	string name;
public:
	static int num;	//静态数据成员不允许在类中初始化
};
//类外初始化,不再需要static修饰,但是需要类名限定
int STU::num = 100;
int main()
{
	//静态数据成员的访问,可以不需要对象
	cout << STU::num << endl;


	while (1);
	return 0;
}

运行结果:
在这里插入图片描述

  • 共有
#include <iostream>
#include <string>
using namespace std;

class STU
{
public:
	STU(string name="") :name(name)
	{
		num++;
	}
protected:
	string name;
public:
	static int num;	//静态数据成员不允许在类中初始化
};
//类外初始化,不再需要static修饰,但是需要类名限定
int STU::num = 1;
int main()
{
	//静态数据成员的访问,可以不需要对象
	cout << STU::num << endl;
	//什么叫做共有
	STU lisi("lisi");
	//静态数据成员可以通过对象去访问
	cout << lisi.num << endl; //此时num等于2
	STU array[3];			 //5
	STU* p = new STU("newSTU");	//6
	cout << STU::num << endl;	
	cout << p->num << endl;
	cout << lisi.num << endl;
	delete p;
	p = nullptr;
	while (1);
	return 0;
}

运行结果:
在这里插入图片描述

2.static成员函数

  • static写在函数前面即可
  • 调用非静态成员,必须要指定对象
#include <iostream>
#include <string>
using namespace std;

class STU
{
public:
	STU(string name="") :name(name)
	{
		num++;
	}
	static void printSTU();
	static void pirntData(STU& lisi)
	{
		cout << lisi.name << "\t" << lisi.num << endl;
	}
protected:
	string name;
public:
	static int num;	//静态数据成员不允许在类中初始化
};
//类外初始化,不再需要static修饰,但是需要类名限定
int STU::num = 1;
//类外初始化,不再需要static修饰
void STU::printSTU()
{
	
	//调用非静态成员,必须要指定对象
	//cout << name << endl; 当这个函数不采用对象去调用,name没有来源
	//静态调用数据,没有什么要求
	cout << num << endl;
	cout << "静态成员函数" << endl;
}
int main()
{
	//静态数据成员的访问,可以不需要对象
	cout << STU::num << endl;
	//什么叫做共有
	STU lisi("lisi");
	//静态数据成员可以通过对象去访问
	cout << lisi.num << endl; //此时num等于2
	STU array[3];			 //5
	STU* p = new STU("newSTU");	//6
	cout << STU::num << endl;	
	cout << p->num << endl;
	cout << lisi.num << endl;
	delete p;
	p = nullptr;
	STU::printSTU();
	lisi.pirntData(lisi);
	while (1);
	return 0;
}

在这里插入图片描述

3.static对象

  • 释放最后释放的

三、友元

友元?用friend描述的关系。友元只是提供一个场所,赋予对象具有打破类权限限定(无视权限)

1.友元函数

  • 普通的友元函数
#include <iostream>
#include <string>
using namespace std;
void printData();
class STU
{
public:
	STU(string name, int age) :name(name), age(age)
	{

	}
	friend void printData()
	{
		//不属于类,不能直接访问
		//cout << name << "\t" << age << endl;
		STU lisi("lisi", 29);
		//友元函数提供一个场所,让对象无视权限
		cout << lisi.name << "\t" << lisi.age << endl;
	}
	void print()
	{
		cout << name << "\t" << age << endl;
	}
	string name;
protected:
	int age;
	friend void printData2(STU& lisi);
};
//不需要friend修饰,不需要类名限定
void printData2(STU& lisi)
{
	cout << lisi.name <<"\t"<< lisi.age << endl;
}
int main()
{
	STU lisi("lisi", 19);
	lisi.print();
	printData2(lisi);
	printData();
	while (1);
	return 0;
}

运行结果:
在这里插入图片描述

  • 以另一个类的成员函数充当友元函数
#include <iostream>
#include <string>
using namespace std;
//向前声明
class B
{
public:
	void printA();
	void printData();
protected:

};
class A
{
public:
	friend void B::printA();
protected:
	string name = "A";
};
//成员函数实现,一定是在另一个类的下面实现
void B::printA()
{
	A a;
	cout << a.name << endl;
}
int main()
{
	B b;
	b.printA();
	while (1);
	return 0;
}

运行结果:
在这里插入图片描述

2.友元类

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

class STU
{
friend class STUD;
public:
	STU(string name, int age) :name(name), age(age)
	{}
protected:
	string name;
	int age;
};
class STUD
{
public:
	void print()
	{
		STU lisi("lisi", 18);
		cout << lisi.name << "\t" << lisi.age<<endl;
	}
	void printSTUD(STU& lisi)
	{
		cout << lisi.name << "\t" << lisi.age << endl;
	}
protected:

};
int main()
{
	STU lisi("lisi", 18);
	STUD zhangsan;
	zhangsan.print();
	zhangsan.printSTUD(lisi);

	while (1);
	return 0;
}

运行结果:
在这里插入图片描述

4、this指针与explicit

explicit

  • 修饰构造函数使用,不让隐式转换使用
#include <iostream>
#include <string>
using namespace std;


class STU
{
public:
	explicit STU(int age) :age(age)
	{

	}
	void print()
	{
		cout << age << endl;
	}
protected:
	int age;
};

int main()
{
	//explicit 不让隐式转换构造
	//STU lisi = 12;
	//STU temp = 1.33;
	STU temp(12);
	temp.print();
	while (1);
	return 0;
}

运行结果:
在这里插入图片描述

2.this指针

  • 避免形参名和数据成员同名,通指对象的地址
  • 充当函数返回值,返回对象自身,用*this表示对象本身
  • 静态成员函数中是不能使用this指针的
#include <iostream>
#include <string>
using namespace std;
class STU
{
public:
	STU(string name, int age) :name(name), age(age){}
	//普通函数不存在初始化参数列表
	void initprintData(string name,int age)
	{
		//类名限定帮助计算机去识别
		STU::name = name;
		this->age = age;
	}
	void print()
	{
		cout << name << "\t" << age << endl;
	}
	void printThis()
	{
		cout << this << endl;
	}
	//对象本身
	STU returnSTU()
	{
		return *this;
	}
	//静态的成员对象是没有this指针的
	/*static void printStatic()
	{
		cout << this->name << "\t" << this->age << endl;
	}*/
protected:
	string name;
	int age;
};

int main()
{
	STU lisi("李四", 18);
	lisi.print();
	lisi.initprintData("张三", 18);
	lisi.print();
	cout << &lisi << endl;
	lisi.printThis();
	STU wangwu("王五", 18);
	cout << &wangwu << endl;
	wangwu.printThis();
	lisi.returnSTU().returnSTU().returnSTU().print();

	while (1);
	return 0;
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值