C++中的类,结构体,构造函数和析构函数
时间:2021-08-11
本文章向大家介绍C++中的类,结构体,构造函数和析构函数,主要包括C++中的类,结构体,构造函数和析构函数使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
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
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PDO::query讲解
- Laravel5框架自定义错误页面配置操作示例
- PHP-FPM和Nginx的通信机制详解
- PHP PDOStatement::columnCount讲解
- PHP中上传文件打印错误错误类型分析
- Laravel如何创建服务器提供者实例代码
- PDO::quote讲解
- php intval函数用法总结
- Python Selenium模块安装使用教程详解
- Python selenium模块实现定位过程解析
- Django ORM判断查询结果是否为空,判断django中的orm为空实例
- ThinkPHP框架整合微信支付之JSAPI模式图文详解
- 一文掌握PHP Xdebug 本地与远程调试(小结)
- PHP生成随机码的思路与方法实例探索
- CI框架教程之优化验证码机制详解【验证码辅助函数】