构造函数、析构函数、构造函数初始化列表、命名空间、对象大小、地址


前言

当创建类的对象时,创建好空间后自动调用构造函数,结束自动调用析构函数
析构函数调用顺序与构造相反。


一、构造函数

#include<iostream>
using namespace std;
#include <stdio.h>
#include <string.h>

class Student{
private:
	char m_No[4],m_Name[21];
	int m_Age,m_Score;
public:
	//Student(){};	//默认构造
	Student( char *name =(char *)"lyc",int age = 20);  //默认参数构造
	Student(char *name,int age,int score); //重载
	Student(const Student & Stu);             //拷贝构造
	~Student();
	
};

Student::Student(char *name ,int age )
{
	strcpy(m_Name,name );
	m_Age = age;	
	cout<< "Student(char *name ,int age )" <<endl;
}
Student::Student( char *name,int age,int score)
{
	strcpy(m_Name,name );
	m_Age = age;
	m_Score = score;
	cout<< "Student(char *name,int age,int score)" <<endl;
}
Student::Student(const Student & Stu)
{
	strcpy(m_Name,Stu.m_Name );
	m_Age = Stu.m_Age;
	m_Score = Stu.m_Score;
	strcpy(m_No,Stu.m_No);
	cout<< "Student(const Student & Stu)" <<endl;
}
Student::~Student()
{

}

int main()
{
	Student Stu;                 //调用默认参数构造
	Student Stu1("www",20,100);  //调用重载构造

	Student Stu2 = Stu;         //调用拷贝构造
 
	return 0;
}


1、默认构造函数

没有写任何构造函数,则系统会自动生成默认的无参构造函数,且此函数为空。

Student(){};	//默认构造

2、重载构造函数

	Student( char *name =(char *)"lyc",int age = 20);  //带默认参数构造
	Student(char *name,int age,int score); //重载构造

3、拷贝构造函数

	Student(const Student & Stu);             //拷贝构造

触发: 当有发生对象内存拷贝的时候
假如 类A 已知对象A obj1;
1.赋值 A obj2 = obj1; 或者 A obj2(obj1);
2. 函数形参 void func(A obj,…) 要注意 void func(A &obj,…)不会触发拷贝构造调用
3.返回值 A func(){ return return_obj};
A obj2 = func();

二、在构造函数中使用初始化列表

初始化列表使用的场合:
当类中的某个数据成员是对象
当类中的某个数据成员使用const修饰
派生类的构造函数,需要初始化基类的成员
当类的数据成员时候引用类型的时候。

初始化列表的格式:
类名::构造函数名(参数总表):成员1(参数表1),成员2(参数表2),……成员n(参数表n){……}

Student(char *name,int age,int score,float f)
		:m_name(name),m_age(age),m_score(score),m_fv(f)
		{};

三、析构函数

作用:撤销对象前做清理工作,一般是释放对象在生存期间动态申请的空间
当对象超出其定义范围时(即释放该对象时),编译器自动调用析构函数。

类名::~默认析构函数名( )
{
}
Student::~Student()
{

}

四、命名空间

命名空间是为了解决大型工程中潜在的名称冲突,定义了相同的名称

定义:
namespace namespace_name {
	int i = 100;
   namespace namespace_name2
   {
		int i = 200;
   }
}
命名空间可嵌套、使用时 ::来分别第几级
using namespace namespace_name1::namespace_name2;

使用:
使用整个命名空间:using namespace name;
使用命名空间中的变量:name::variable   

如:
using namespace std;  声明这个之后,调用cout就不需要在前面加  std::
std ::cout;

五、this指针

类的对象共享一份成员函数,拥有各自的数据成员。

1、this指针是对象指向自身的指针(内存地址)。
2、当调用成员函数时,会把this指针传递给成员函数。
3、成员函数访问对象的数据成员是通过this指针来访问的。
4、可以访问对象自身 *this

六、补充:声明对象数组、对象大小、地址

①、声明对象数组:

Student A[2] = {Student(xx,xx),Student (xx,xx) }

②、对象大小、地址

总结:
1.对象的大小等于数据段成员的大小即非静态数据成员总和
2.对象的地址等于第一个数据成员的地址
3.一个类所有对象都有自己独立的对象数据空间。
4.一个类所有对象共用一份方法。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值