C++学习总结(十一)——类的静态函数,成员函数的默认参数,类中包含引用和常量

一.类的静态成员变量,以及静态函数。

静态成员变量:

1.静态成员共享机制

2.静态成员局部属于类,它不是对象的成员,位于静态区。

3.静态成员变量需要在外部进行初始化。

静态函数:

1.静态成员函数都在代码区,类的静态函数都是共享的。

2.类的大小不包含代码区,创建指向类方法的指针,需要指定所属的类。如有类函数void go();想要创建指向该函数的指针,则创建方式如下:

class myclass
{
 public:
 static void go(){};  void go1(){};
 };
void (*p)()=&myclass::go1; void (*p1)()=&go;
3.静态函数不需要进行类的指定。

4.static const int num; 该变量类型位于静态常量区(可读不可写),调用时不读内存,直接调用符号表。

二.类与内存

类在内部存在引用时,需要进行初始化,引用在输出时不可用std::endl,否则会关闭流,当做地址输出。常量与引用必须重载构造函数进行初始化,且常量只可以初始化一次。

#include

class myclass
{
public:
	int num;
	int data;
	int *p;
	const int coint = 0;//类内部定义常量要先对其进行初始化
	int & myint; //类内部包含引用,要对其进行初始化,否则会报错,通过构造函数进行初始化
	static int shu;
	static const int scnum;
public:
	static void go()
	{

	}
	void run()
	{

	}
	//重载构造函数,对常量和引用进行初始化
	myclass(int a,int b):myint(a),coint(b)
	{
		//引用共用地址,常量备份新开辟地址
		std::cout << &a << " " << &b << std::endl;
		std::cout << &myint << " " << &coint << std::endl;
		const int *p = &coint;
		std::cout << coint << " " << *p << std::endl;
		int *px = const_cast(p);//去掉const属性
		*px = 12;
		std::cout << coint <<" "<<*px<< std::endl;
	}

	~myclass()
	{

	}
//private:
};

int myclass::shu = 0;
const int myclass::scnum = 10;
void main1()
{
	int data1 = 10;
	myclass m1(data1,10);
	std::cout << m1.myint ;//std::endl 加上关闭输出流,当做地址输出
	int data2 = 20;
	m1.myint = data2;
	std::cout << m1.myint;


	std::cin.get();

}

class myclass1
{

public:
	const int num;
public:
	myclass1(int data) :num(data)
	{

	}
};

void main2()
{
	int data(100);
	myclass1 m1(data);
	std::cout << m1.num << std::endl;
	//m1.num = 1000;  常量只可以进行一次初始化
	std::cin.get();
}

int main()
{	//类中的普通成员变量
	//类名  变量名   栈上
	//类名  *指针名 =new 类名 堆上
   //类的静态成员  静态区
    //静态函数,成员函数都在代码区,类的函数共享
	myclass mm(0,0);

	//位于代码区
	void (myclass::*p)() = &myclass::run; //代码共享,通过类名进行区分
	void(*p1)() = &myclass::go;//静态函数,不需要说明类名

	std::cin.get();
}


三.类的成员函数的默认参数

通过调用默认参数,减少构造函数的重写,默认参数从左向右进行调用。

#include
class goodclass
{
public:
	int num=1; //默认初始化的值
	const int data=90; //默认初始化,减少重写构造函数
public:
	static void show(goodclass good1)
	{
		std::cout << good1.num << " " << good1.data << std::endl;
	}
};

void main()
{
	goodclass good1;
	goodclass::show(good1);
	const int *px = &(good1.data);
	int *p = const_cast(px);
	*p = 123;
	goodclass::show(good1);
	std::cin.get();
}



你可能感兴趣的:(C++,C++学习总结)