【C++】类和对象1四个默认的函数的小总结

面向对象oop的基本思想

 

C++三大特征:封装、继承、多态

public:任意位置访问

protected:本类、子类中访问

private:本类中访问

 

struct和class的一些小区别:

默认的继承访问权限:struct是public,class是private

初始化的方式不同

 

this(thiscall)

类中普通的成员方法中有默认的参数

普通成员方法要依赖对象调用

 

成员方法在实现

类中:inline(内联)

类外:普通

 

类中6个默认的函数

特点:公有的,内联的

1.构造函数

2.析构函数

3.拷贝构造函数

4.赋运算符的重载函数

5.取地址操作符的重载函数

6.const修饰的取地址操作符的重载函数

 

构造函数

     初试化对象的内存空间

     有this指针

     可以重载

     不能手动调用

      顺序构造

 

析构函数

     释放(销毁)资源

     不可重载

     有this指针

     能手动调用==>退化成普通函数调用

     先构造的后析构

 

拷贝构造函数  (默认函数是浅拷贝)

拿已存在的对象来生成一个相同类型的新对象

1.形参用&接收   防止递归构造形参对象导致栈溢出

 

在Linux操作系统下写一个text.c文件,定义一个空的类型,查看他的地址

可以发现他的地址与他前面的变量共用一个地址

 

在Windows系统下,.c文件不能定义空的类型

 

在Windows系统下,写一个text.cpp文件,定义一个空的类型,查看他的大小

#include <iostream>

struct Node
{
};

int main()
{
	Node node;
	int i = sizeof(node);
	std::cout<<i<<std::endl;
}

空类型的实例中不包含任何信息,本来求sizeof应该是0,但是当我们声明该类型的实例的时候,它必须占用一定的空间,否则无法使用这些实例。至于占用多少内存,由编译器决定。在vs中,每个空类型的实例占用1字节的空间。

 

#include <iostream>

class CGoods
{
public:
	CGoods()
	{
		std::cout<< "CGoods::CGoods()"<<std::endl;
		mname = new char[1]();
	}
	CGoods(char* name)
	{
		std::cout<<"CGoods::CGoods(char*)"<<std::endl;
		mname = new char[strlen(name) + 1]();
		strcpy(mname,name);
	}
	CGoods(char* name,int amount,float price)
	{
		std::cout<<"CGoods::CGoods(char*,int,float)"<<std::endl;
		mname = new char[strlen(name) + 1]();
		strcpy(mname,name);
		mamount = amount;
		mprice = price;
	}

	~CGoods()
	{
		std::cout<<"~CGoods"<<std::endl;
		delete[] mname;
	}
private:
	char *mname;
	int mamount;
	float mprice;
};

int main()
{
	CGoods goods1;
	CGoods goods2("mianbao");
	CGoods goods3("dangao",20,1.1);
	return 0;
}

打开反汇编,构造函数不能自己调用,析构函数可以自己调用

 

 

#include <iostream>

class CGoods
{
public:
	CGoods()
	{
		std::cout<<this<<std::endl<< "CGoods::CGoods()"<<std::endl;
		mname = new char[1]();
	}
	CGoods(char* name)
	{
		std::cout<<this<<std::endl<<"CGoods::CGoods(char*)"<<std::endl;
		mname = new char[strlen(name) + 1]();
		strcpy(mname,name);
		mamount = 0;
		mprice = 0;
	}
	CGoods(char* name,int amount,float price)
	{
		std::cout<<this<<std::endl<<"CGoods::CGoods(char*,int,float)"<<std::endl;
		mname = new char[strlen(name) + 1]();
		strcpy(mname,name);
		mamount = amount;
		mprice = price;
	}

	~CGoods()
	{
		std::cout<<this<<std::endl<<"~CGoods"<<std::endl;
		delete[] mname;
	}
	void show();
private:
	char *mname;
	int mamount;
	float mprice;
};

void CGoods::show()
{
	std::cout<<"name : "<<mname<<std::endl;
	std::cout<<"amount : "<<mamount<<std::endl;
	std::cout<<"price : "<<mprice<<std::endl;
}
int main()
{
	CGoods goods2("mianbao");
	goods2.show();
	CGoods goods3("dangao",20,1.1);
	goods3.show();
	return 0;
}

 

可以看出对象是先构造后析构

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值