struct 和 class的区别
C++中可以通过使用struct、class定义一个类,本质上他们没有任何的区别,唯一的区别就是struct的默认成员权限是public,class默认成员权限是private
构造函数
构造函数(也叫构造器),在对象创建的时候自动调动,一般用于完成对象的初始化工作
特点:
函数名与类名同名,无返回值(void 也不写),可以有参数,可以重载,可以有多个构造函数
一旦定义了一个构造函数,就必须使用其中一个自定义的构造函数来初始化
Example
class Person {
int m_age;
Person() {}
Person(int age):m_age(age){}
void display(){
cout << this->m_age << endl;
}
};
Person g_p1; //Person()
Person g_p2(); //这是一个函数声明,函数名叫g_p2,返回类型Person,无参
Person g_p3(20); //Person(int)
int main(){
Person p1; //Person()
Person p2(); //这是一个函数声明,函数名叫g_p2,返回类型Person,无参
Person p3(20); //Person(int)
Person *p4 = new Person; //Person()
Person *p5 = new Person(); //Person()
Person *p6 = new Person(20); //Person(int)
return 0;
}
注意
- 通过malloc分配的对象不会调用构造函数,并且需要注意的是编译器并不一定会为每一个类生成空的无参构造函数,是否生成构造函数取决于是否需要做些额外的事情(内存操作,函数调用),比如:
- 成员变量在声明的同事进行了初始化
- 有定义虚函数
- 虚继承了其他类
- 包含了对象类型的成员,且这个成员有构造函数(编译器生成或者自定义)
- 父类有构造函数(编译器生成或者自定义)
默认情况下成员变量的初始化
Person g_p1; //全局区,成员变量初始化为0
int main(){
Person p1; //栈区不会被初始化
Person *p2 = new Person; //成员变量不会被初始化
Person *p3 = new Person(); //成员变量初始化为0
Person *p4 = new Person[3]; //成员变量不会被初始化
Person *p5 = new Person[3](); //3个Person对象的成员变量都初始化为0
Person *p6 = new Person(){}; //3个Person对象的成员变量都初始化为0
cout << "g_p1" << g_p1.getAge() << endl;
cout << "p1" << g_p1.getAge() << endl;
cout << "p2" << g_p2->getAge() << endl;
cout << "p3" << g_p3->getAge() << endl;
cout << "p4" << g_p4->getAge() << endl;
cout << "p5" << g_p5->getAge() << endl;
cout << "p6" << g_p6->getAge() << endl;
return 0;
}
如果自定义了构造函数,除了全局区,其他内存空间的成员变量默认都不会被初始化,需要开发人员手动初始化
Person() {
memset(this,0,sizeof(Person));//初始化全部成员变量为0
}
析构函数
析构函数(析构器),在对象销毁的时候自动调用,一般用于完成对象的清理工作
特点:
函数名以~开头,与类同名,无返回值(void也不写),无参,不可以重载,有且只有一个析构函数
注意
通过malloc分配的对象调用free的时候不会调用析构函数
构造函数、析构函数要声明为public,才能被外界正常使用,析构函数通常用来处理对象内部申请的堆空间,在对象销毁的时候由对象内部自己回收。
class Car
{
private:
int m_price;
public:
Car() {};
~Car() {};
};
class Person {
Car *m_car;
Person() {
m_car = new Car();
}
~Person() {
if(m_car == nullptr) return;
delete m_car;
m_car = nullptr;
}
};
原文链接: https://www.cnblogs.com/mengqingxiang/p/15128504.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/212945
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!