【C++】【学习笔记】【015】构造和析构
2014-11-10 13:54
246 查看
在创建对象时,系统都会自动调用一个特殊的方法,即构造器。
构造器和通常方法的主要区别:
1、构造器的名字必须和它所在的类的名字一样;
2、系统在创建某个类的实例时会第一时间自动调用这个类的构造器;
3、构造器永远付汇返回任何值。
4、创建构造器,需要先把它的声明添加到类里。如下:
注意点:
1、每个类至少有一个构造器,如果没有在类里定义一个构造器,编译器就会使用如下语法默认定义一个: ClassName::ClassName(){}
2、这是一个没有代码内容的空构造器,除此之外,编译器还会默认创建一个副本构造器(CopyConstructor,后续讲解)。
3、这一切都是发生在幕后。
相应地,在销毁一个对象时,系统也会调用另一个特殊的方法,即析构器。
一般来说,构造器用来完成事先的初始化和准备工作(申请分配内存),析构器用来完成事后所必须的清理工作(清理内存)。
构造器和析构器两者有许多共同之处:
1、析构器有着和构造器/类一样的名字,只不过前边多了一个波浪符“~”前缀;
2、析构器也永远不返回任何值;
3、析构器不带参数,所以析构器的声明永远是如下格式:~ClassName();
4、在比较复杂的类里,析构器往往至关重要(可能引起内存泄露)。在构造器中申请的内存,一定要在析构器中进行释放。
程序练习:构造函数打开文件,析构函数关闭文件
构造器和通常方法的主要区别:
1、构造器的名字必须和它所在的类的名字一样;
2、系统在创建某个类的实例时会第一时间自动调用这个类的构造器;
3、构造器永远付汇返回任何值。
4、创建构造器,需要先把它的声明添加到类里。如下:
class Car { Car(void); };5、注意大小写与类名保持一致。在结束声明之后开始定义构造器本身。如下:
#include <iostream> class Car { public: std::string color; std::string engine; unsigned int gas_bank; unsigned int wheel; Car(void); // 构造函数 void fillTank(unsigned int liter); int running(void); }; // 构造函数 Car::Car(void) { color = "WHITE"; engine = "V8"; wheel = 4; gas_bank = 85; } void Car::fillTank(unsigned int liter) { gas_bank += liter; } int main() { Car car1; std::cout << "color: " << car1.color << std::endl; return 0; }
注意点:
1、每个类至少有一个构造器,如果没有在类里定义一个构造器,编译器就会使用如下语法默认定义一个: ClassName::ClassName(){}
2、这是一个没有代码内容的空构造器,除此之外,编译器还会默认创建一个副本构造器(CopyConstructor,后续讲解)。
3、这一切都是发生在幕后。
相应地,在销毁一个对象时,系统也会调用另一个特殊的方法,即析构器。
一般来说,构造器用来完成事先的初始化和准备工作(申请分配内存),析构器用来完成事后所必须的清理工作(清理内存)。
构造器和析构器两者有许多共同之处:
1、析构器有着和构造器/类一样的名字,只不过前边多了一个波浪符“~”前缀;
2、析构器也永远不返回任何值;
3、析构器不带参数,所以析构器的声明永远是如下格式:~ClassName();
4、在比较复杂的类里,析构器往往至关重要(可能引起内存泄露)。在构造器中申请的内存,一定要在析构器中进行释放。
class Car { public: Car(void); // 构造函数 ~Car(); // 析构函数 };
程序练习:构造函数打开文件,析构函数关闭文件
#include <iostream> #include <fstream> #include <string> // 构造函数打开文件,析构函数关闭文件 class StoreQuote { public: std::string quote, speaker; std::ofstream fileOutput; StoreQuote(); ~StoreQuote(); void inputQuote(); void inputSpeaker(); bool write(); }; // 构造函数 StoreQuote::StoreQuote() { fileOutput.open("test.txt", std::ios::app); } // 析构函数 StoreQuote::~StoreQuote() { fileOutput.close(); } void StoreQuote::inputQuote() { std::getline(std::cin, quote); } void StoreQuote::inputSpeaker() { std::getline(std::cin, speaker); } bool StoreQuote::write() { if (fileOutput.is_open()) { fileOutput << quote << "|" << speaker << "\n"; return true; } else { return false; } } int main() { StoreQuote quote; std::cout << "Input quote: "; quote.inputQuote(); std::cout << "Input author:"; quote.inputSpeaker(); if (quote.write()) { std::cout << "Write file successfully!"; } else { std::cout << "Write file fail!"; } return 0; }
相关文章推荐
- C++学习笔记:继承中的构造与析构
- c++学习笔记(7.构造与析构)
- C++学习笔记--继承中的构造与析构
- C++学习笔记之——局部对象和临时对象的构造和析构时机
- C++学习笔记:3.3.4 继承和组合混搭情况下,构造和析构调用顺序
- GeekBand学习笔记:C++三大函数:拷贝构造、拷贝赋值、析构函数
- php学习笔记------[面向对象的构造与析构方法]
- C++学习之构造析构的应用
- c++ 11学习笔记--右值引用和移动构造语义
- php学习笔记 面向对象的构造与析构方法
- 【C++学习历程3】对象的构造和析构
- Python学习笔记009_构造与析构
- 深度探索C++对象模型复习和学习 第五章:构造、析构、拷贝、语意学
- C++学习手记(三)——构造与析构
- C++入门学习:继承中的构造和析构以及同名成员情况
- C++学习笔记--二阶构造模式
- c++学习笔记4,调用派生类的顺序构造和析构函数(一个)
- Effective c++学习笔记——条款09:绝不在构造和析构过程中调用virtual函数
- 《深度探索c++对象模型》 学习笔记 - 5 构造、析构、拷贝 语义学
- Effective c++学习笔记——条款09:绝不在构造和析构过程中调用virtual函数