构造函数、析构函数、构造函数初始化列表
前言
当创建类的对象时,创建好空间后自动调用构造函数,结束自动调用析构函数
析构函数调用顺序与构造相反。
一、构造函数
#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.一个类所有对象共用一份方法。