c++04

c++04,第1张

this指针
#include
using namespace std;

//空类的对象占1个字节
//类中的成员变量 创建对象时才存在 每个对象都有自己独立的一份
//类中的成员函数 编译期存在 只有一份 每个对象都可以使用
//this 指针 关键字 指向当前调用本成员函数的对象
//this指针只能在成员函数(非静态)中使用

class AA
{
public:
	int a;
	char b;
	//有对齐
public:
	void Show(/*  AA* const this  *//*int a*/)
	{
		cout << this->a<<"  "<b << endl;
		/*this->a = a;*/
		//在函数里可以将成员变量看成全局变量 参数看成局部变量 当同名时 优先识别局部变量 所以给成员函数赋值用到this指针
		/*this++;*/
		//this 不可以改
	}
	//不占用对象的空间
};
class BB
{
public:
	void Show()
	{
		cout << "BB" << endl;
	}
};


int main()
{
	AA a;
	a.a = 100;
	a.b = 'a';
	a.Show();
	AA b;
	b.a = 200;
	b.b = 'b';
	b.Show();
	cout << sizeof(a) << endl;
	

	/*BB b;
	cout << sizeof(BB) << endl;*/

	system("pause");
	return 0;
}
拷贝构造
#include
using namespace std;
//不能在类中定义本类的对象
//类中含有一个默认的拷贝构造函数  只有一个参数 本类类型的引用的构造函数
//什么情况下会调用拷贝构造
//1.用一个对象初始化另一个对象时
//2.类对象作为函数参数时
//3.函数返回值为类对象时 用局部对象初始化临时对象
class AA
{
public:
	int a;
public:
	AA() {};
	AA(const AA &a)  //本类的引用
	{
		this->a = a.a;
		cout << "AA COPY" << endl;
	}
};
void Show(AA a)//->形参
{
	cout << a.a << endl;
}
AA func()
{
	AA a;
	a.a = 200;
	return a;
}

int main()
{
	/*AA a;
	a.a = 100;
	
	Show(a);*///实参  函数调用 实参向形参赋值 实参初始化了形参 所以执行了拷贝构造
	
	
	
	对象的初始化
	//AA b = a;
	//AA c(a);
	//
	赋值
	//AA d;
	//d = a;

	/*cout << func().a << endl;*/
	//当返回值为类对象时 会先生成一个临时对象 并用局部对象初始化临时对象 所以执行了拷贝构造

	AA a = func();
	cout << a.a << endl;
	//执行了一次拷贝构造 只执行了局部初始化临时  没执行临时初始化main中对象
	system("pause");
	return 0;
}
浅拷贝深拷贝
#include
using namespace std;
//浅拷贝 将源对象的值拷贝到目标对象
//深拷贝 拷贝的时候先开辟一个与源对象成员空间大小一样的空间 然后再将空间中的内容赋值过来
class AA
{
public:
	int* p;
public:
	AA()
	{
		p = new int;
		*p = 100;
	}
	AA(AA &a)
	{
		p = new int;
		*p = *a.p;

	}
	~AA()
	{
		if (p != NULL)
		{
			delete p;
		}
	}
};

void Show(AA &a)   //用类的引用作为函数参数 避免浅拷贝问题 没执行拷贝构造
{
	cout << *a.p << endl;
}
int main()
{
	AA a;
	cout << *a.p << endl;
	/*AA b = a;
	cout << *b.p << endl;*/

	Show(a);



	system("pause");
	return 0;
}
静态成员
#include
using namespace std;

int a = 100;//全局变量 在别的文件中需要外部引用 extern
//static int a;   静态全局变量 在声明它的整个文件都是可见的,而在文件之外是不可见的
void Show();//只需声明一下就可以 在其他文件中实现

//全局变量 使用范围整个程序 在其他文件中使用要外部引用 extern
//静态变量 使用范围 在作用域内定义 本作用域内 在作用域外定义 当前文件可以使用

//静态成员变量 只有一份 所有对象共享
//静态成员要在类外初始化
//初始化的格式  类型 + 类名 + :: + 变量名
//静态成员变量必须要在类外初始化如果不赋值 默认初始化为0
//可以不用对象直接访问   类名:: + 变量名
//依旧遵循访问修饰符的约束
class AA
{
public:
	static int a;//在类中定义静态变量 需要在类外进行初始化
	int b;
public:
	void Show()
	{
		cout << a << "  " << b << endl;
	}
	static void Showshow();
};
int AA::a = 100;//类外进行初始化
void AA::Showshow()//静态成员函数类外实现
{
	cout << a /*<< " " << b */<< endl;//不能使用普通变量 
}
//普通成员函数可以使用静态成员变量
//静态成员函数只能使用静态成员变量 不能使用普通成员变量
//静态成员函数没有this指针  所以找不到普通变量
int main()
{
	/*cout << ::a << endl;
	Show();*/

	AA a;
	/*a.a = 100;*/
	a.b = 200;
	a.Show();
	cout << sizeof(AA) << endl; //大小为4  存的是 int b
	AA b;
	b.b = 20;
	b.Show();

	system("pause");
	return 0;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/563212.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-02
下一篇 2022-04-02

发表评论

登录后才能评论

评论列表(0条)

保存