const和static

const和static参考链接

#include <iostream>
using namespace std;

class Time
{
public:
	Time(int h = 1, int m = 1, int s = 1)
		:_h(h)
		, _m(m)
		, _s(s)
	{
		cout << "Time(int h = 1, int m = 1, int s = 1)" << endl;
	}
private:
	int _h;
	int _m;
	int _s;
};

class Date
{
public:
	//初始化列表: 成员变量初始化的地方,也是成员定义的地方
	//           每一个成员变量只能出现一次
	//   :成员变量(初始值或者初始化表达式), 后续的成员变量 
	Date(int y = 1, int m = 1, int d = 1)
		: _ra(d)   //引用类型必须在初始化列表中初始化,
		, _ca(1)  //const成员必须在初始化列表中初始化
		//, _t(23,59,59) //没有默认构造函数的自定义成员必须在初始化列表中初始化
	{
		/*
		//赋值操作
		_year = y;
		_month = m;
		_day = d;

		_year = y;
		_year = y;
		*/
		//_t = Time(23, 12, 12);
	}

	Date(const Date& date)
		:_year(date._year)
		, _month(date._month)
		, _ra(date._ra)
		, _ca(date._ca)
		, _t(date._t)
	{}

	void Display()  //void Display(Date* const this)
	{
		cout << "Display ()" << endl;
		cout << "year:" << _year << endl;
		cout << "month:" << _month << endl;
		cout << "day:" << _day << endl << endl;
		_day = 10;
		cout << "void Display()" << endl;
		//非const成员函数可以调用const成员函数,权限可以被缩小
		fun2();
		fun1();
	}
	//const修饰的为this指针,表示其为const Date* const类型, 此const修饰的为内容,表示内容不能变
	void Display() const  // void Display(const Date* const this)
	{
		cout << "Display () const" << endl;
		cout << "year:" << _year << endl;
		cout << "month:" << _month << endl;
		cout << "day:" << _day << endl << endl;
		//_day = 10;
		cout << "void Display() const " << endl;
		//const成员函数不能调用非const成员函数, 权限不能被放大的
		//fun1();

		fun2();
	}

	void fun1()
	{}

	void fun2() const
	{}

	//取地址成员函数 &  不需要实现&重载函数
	Date* operator&()
	{
		return this;
	}
	//const 取地址成员函数
	const Date* operator&() const
	{
		return this;
	}
private:
	int _year; // 年
	int _month; // 月
	int _day; // 日
	int& _ra;
	const int _ca;
	Time _t;
};

class Test
{
public:
	//成员的初始化顺序和声明顺序一致,与其在初始化列表中的顺序没有关系
	//尽量和声明顺序保持一致
	// Test t1(10); 结果为_a = 随机值, _b = 10
	Test(int b)
		:_b(b)
		, _a(2 * _b)
	{}
private:
	int _a;
	int _b;
};

//普通函数不用const修饰的,因为函数没有this指针
void fun(int a)//const
{
	cout << "fun" << endl;
}

const成员函数只能调用const成员变量和const成员函数, 不能调用非const成员函数,
非const成员函数可以调用const函数

引用类型和const成员必须在初始化列表中初始化, static成员在内外初始化
没有默认构造函数时,自定义成员必须在默认构造函数初始化

static

单参隐式类型转换(explicit可禁止隐式类型转换)

#include <iostream>
using namespace std;

//定义全局变量
int cnt = 0;
class A
{
public:
	/* explicit: 禁止单参构造函数的隐式类型转换 */
	/*explicit*/ A(int a)
		:_a(a)
	{
		++_cnt;
		cout << "A(Int)" << endl;
	}

	A(int a, int b)
		:_a(a)
	{
		++_cnt;
	}

	A(const A& a)
		:_a(a._a)
	{
		++_cnt;
		cout << "A(const A&)" << endl;
	}
	A& operator=(const A& a)
	{
		if (this != &a)
		{
			_a = a._a;
		}
		cout << "A& operator=" << endl;
		return *this;
	}
	//非静态成员函数可以调用、访问静态成员
	void fun1()
	{
		cout << this->_a << endl;
		cout << _cnt << endl;
		fun2();
		displayA();
	}

	//静态成员函数:  没有this指针, 只能调用/访问静态成员,不能访问非静态成员
	static void displayA()
	{
		cout << "displayA" << endl;
		//cout << this->_a << endl;
		cout << _cnt << endl;
		fun2();
		//fun1();
	}

	static void fun2()
	{

	}

//private:
	int _a;
	static int _cnt; // 静态成员, 类成员,所有对象共享, 存放在数据段, 并不是存放在对象中
};

int A::_cnt = 0;  //静态成员在类外初始化

void fun1()
{
	int a = 1;
	float b = 2.0;
	a = b;  //隐式类型转换

	A a1(10);  

	A a2 = 20;  //隐式类型转换: 20传参,调用构造函数,创建一个匿名对象, 拷贝构造, 编译器优化,直接调用构造函数

	a2 = 30;  // 构造, 赋值运算符

	//A a3 = 20, 30;  //自定义类型的隐式类型转换: 只支持单参构造函数
}

A fun(A a)
{
	A b = a;
	return b;
}

void test1()
{
	A a(20);
	fun(a);
	cout << a._cnt << endl;
}

void test2()
{
	A a1 = 1;
	A a2 = 2;
	A a3 = 3;
	A a4 = 4;
	//静态成员访问形式: 1: 对象访问  2 类名 + 作用域限定符
	cout << &a1._cnt << endl;
	cout << &a2._cnt << endl;
	cout << &a3._cnt << endl;
	cout << &a4._cnt << endl;

	cout << &A::_cnt << endl;

	cout << sizeof(A) << endl;

	a1.displayA();
	A::displayA();
}

	//test4();
	//test5();
	test6();
	return 0;
}

1.所有的对象共享static成员
2.访问形式 : 对象, 类名::
3.static成员函数里面没有this指针, static成员函数只可以调用static成员函数,非static成员函数无限制
4.static成员只能在类外初始化
5.修饰的变量只能在当前文件域中访问

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值