- 拷贝构造函数
格式:
//Point(const Point& other)
Point(const Point& other)
{
cout << "默认拷贝构造函数"<<endl;
this->x = other.x;
this->y = other.y;
}
使用:
Point p3(p); //等价于Point p3 = p;
//构造函数的参数是该类的一个对象,---- 拷贝构造函数
// 用其他对象给在创建新的对象时,把对象的值拷贝给新对象时调用拷贝构造函数
//系统提供一个默认的拷贝构造函数,而且拷贝构造函数的格式是固定的
// 类名(const 类名& 对象名) ----- Point(const Point& other)
//一旦实现默认拷贝构造函数,系统默认拷贝构造函数不复存在
- 析构函数
1)引入析构函数的意义:在消毁对象时,进行清理的工作
2)语法:
~类名(无参)
{
}
比如:
~Teacher()
{
//在析构函数中,做清理工作
if(this->name != NULL)
{
free(this->name);
this->name = NULL;
}
}
/*
注意事项:
1)析构函数格式是固定的,一个类只有一个析构函数,不可以重载
2)对象消毁时,自动被调用,但它不消毁对象本身
3)如果在该类中不需要做清理工作,可以不手动实现析构函数,采用系统默认的析构函数
*/
- 构造函数的初始化列表
格式:
Test(int m_a,int m_b):a(m_a),b(m_b)
- 基本的类型做成员变量
//用构造函数初始化列表 来初始化成员变量
#else
Test(int m_a,int m_b):a(m_a),b(m_b)
{
}
- 类的对象做成员变量
Test(int m_a, int m_b,A m_a1,A m_a2):a(m_a),b(m_b),a1(m_a1),a2(m_a2)
{
}
// 类做为成员变量,该类中在实现无参的构造函数,否则,会编译报错
A a1;
A a2;
//如果是类对象来做为成员变量时,初始化对象的顺序:
A a1;
A a2;
//如果有多个对象做为成员变量,初始化顺序是按照成员变量声明的顺序,跟初始化列表顺序无关
面试题:关于构造函数和析构函数的输出
构造函数的调用顺序是按照程序中调用的顺序先后执行对应的构造函数,而析构函数的执行顺序刚好是相反的,它符合栈的规则,构造函数和析构函数是成对调用
- 构造函数可以使用默认参数
A(int x=0,int y = 10) //默认参数
{
cout << "A(int x,int y = 10)" << endl;
this->x = x;
}
如果构造函数采用默认参数,则使用者可以根据自己需求来传参
- 面向对象编程思想分析
案例:求圆的周长和面积
面向对象:狗.吃(骨头)
面向过程:吃(狗,骨头)
- 同类对象之间的数据共享----static
语法:
//在类中声明
class Person
{
private:
int age;
static int sum; //在类中声明静态成员变量
}
//在类外初始化
int sum = 0; //普通全局变量
int Person::sum = 0; //在类的外部初始化,必须
调用:
- 类名::静态成员变量 ---- Person::sum
- 对象.静态成员变量 ---- p.sum
静态成员函数:
作用:用来管理和维护静态成员变量
在类中实现:
static void set_sum(int num) //它属于类本身,不属于具体对象
{
//this->sum = sum; //静态成员函数中不能使用this指针
sum += num;
// age = age+1; // 静态成员函数中不能访问普通的成员变量,只能使用静态成员变量
}
static int get_sum()
{
return sum;
}
在类中声明和类外实现:
static void set_sum(int num);
static int get_sum();
void Person::set_sum(int num) //它属于类本身,不属于具体对象
{
//this->sum = sum; //静态成员函数中不能使用this指针
sum += num;
// age = age+1; // 静态成员函数中不能访问普通的成员变量,只能使用静态成员变量
}
int Person::get_sum()
{
return sum;
}
静态成员函数使用:
类名::静态成员函数调用
对象.静态成员函数调用
Person::get_sum() << p.get_sum()
注意事项:
1)对于静态成员变量,在类中声明,必须在类外初始化
2)静态成员函数中不能使用this指针
3)静态成员函数中不能访问普通的成员变量,只能使用静态成员变量
- 在堆上创建对象
在栈上 对象:可以自动调用构造函数和析构函数
在实际的开发过程,往往也需要在堆上来创建对象,对于C++提供了一个更简单的方法:new、delete运算符
new ---- 在堆上创建一个对象
delete — 消毁对象
Person* p = new Person; //调用无参构造函数
Person* p = new Person(19);//调用有参的构造函数
面试题:简述new/delete和malloc/free的区别