C++之内联函数+类内/外定义+构造函数+初始化列表+析构函数
2017-03-03 11:11
330 查看
内联函数:
关键字是inline,如下应用:
内联函数与普通函数的区别如下:(相当于内联函数省去了步骤2和4)
类内定义:将函数的函数体定义在类内。
类内定义与内联函数的关系:类内定义就是默认为inline内联函数。
类外定义:
类外定义就是函数体在类外面,分为同文件类外定义和分文件类外定义。
在数据结构中,内存的分区如下所示:
栈区由系统管理,分配和回收不需要程序员关心。
在申明一个类后,不会占用存储。只有在实例化一个对象时,才会在堆或栈中占据空间。若没有对实例化的数据初始化,是非常危险的。所以要对其初始化。为了防止漏初始化和重复初始化,C++设置了构造函数。构造函数的最大特点就是在对象实例化时自动调用,被调用且仅调用一次,构造函数与类名是相同的,构造函数没有返回值,可以重载,当用户没有定义构造函数时,系统自动生成一个构造函数。
无参构造函数:
有参构造函数:
重载构造函数:
初始化列表,如下面代码:
初始化列表有几个特性:
1。初始化列表先于构造函数执行
2。初始化列表只能用于构造函数
3。初始化列表可以同时初始化多个数据成员
初始化列表的必要性:
下面我们来看一段代码:
在main()函数初始化中,将stu1的复制给了stu2和stu3,理论上应该是初始化了三次,那么应该输出三行“student”,但实际运行后我们发现,只输出一行“student”。这两种实例化方式时调用的是拷贝构造函数,而不是代码中的构造函数:
定义格式:类名(const 类名& 变量名)
在没有定义拷贝构造函数时,系统会自动生成一个拷贝构造函数并调用,这也是为什么上面代码只输出了一个“student”。
析构函数:
析构函数在对象销毁时自动调用,归还系统资源。
格式为:~类名()。
析构函数的特性:
1.如果没有自定义的析构函数则系统自动生成
2.析构函数在对象销毁时自动调用
3.析构函数没有返回值,没有参数也不能重载
下面一段代码展示了析构函数的重要性。析构函数可以释放掉堆中的内存。
关键字是inline,如下应用:
inline void fun() { cout << "hello " << endl; }
内联函数与普通函数的区别如下:(相当于内联函数省去了步骤2和4)
类内定义:将函数的函数体定义在类内。
类内定义与内联函数的关系:类内定义就是默认为inline内联函数。
类外定义:
类外定义就是函数体在类外面,分为同文件类外定义和分文件类外定义。
在数据结构中,内存的分区如下所示:
栈区由系统管理,分配和回收不需要程序员关心。
在申明一个类后,不会占用存储。只有在实例化一个对象时,才会在堆或栈中占据空间。若没有对实例化的数据初始化,是非常危险的。所以要对其初始化。为了防止漏初始化和重复初始化,C++设置了构造函数。构造函数的最大特点就是在对象实例化时自动调用,被调用且仅调用一次,构造函数与类名是相同的,构造函数没有返回值,可以重载,当用户没有定义构造函数时,系统自动生成一个构造函数。
无参构造函数:
class Student() { public: **Student()**{ m_strName = "jim"; } private: string m_strName; }
有参构造函数:
class Student() { public: **Student(string name)**{ m_strName = name; } private: string m_strName; }
重载构造函数:
class Student() { public: **Student()**{ m_strName = "Jim"; } **Student(string name)**{ m_strName = name; }//重载的构造函数 private: string m_strName; }
初始化列表,如下面代码:
class Student() { public: Student() :m_strName("Jim"), m_iAge(10){}//初始化列表 private: string m_strName; int m_iAge; }
初始化列表有几个特性:
1。初始化列表先于构造函数执行
2。初始化列表只能用于构造函数
3。初始化列表可以同时初始化多个数据成员
初始化列表的必要性:
//初始化列表的必要性 class Circle { public: Circle(){m_dPi=3.14}//错误,编译器提示是const类型,不能再复赋值 private: const double m_dPi; }; class Circle { public: Circle():m_dPi=3.14{ }//若初试化的话正确 private: const double m_dPi; };
下面我们来看一段代码:
class Student { public: Student() { cout << "Student" << endl; } private: string m_strName; }; int main() { Student stu1; Student stu2 = stu1; Student stu3(stu1); return 0; }
在main()函数初始化中,将stu1的复制给了stu2和stu3,理论上应该是初始化了三次,那么应该输出三行“student”,但实际运行后我们发现,只输出一行“student”。这两种实例化方式时调用的是拷贝构造函数,而不是代码中的构造函数:
定义格式:类名(const 类名& 变量名)
class Student { public: Student(){ m_strName = "Jim"; } **Student(const Student& stu){}** private: string m_strName; };
在没有定义拷贝构造函数时,系统会自动生成一个拷贝构造函数并调用,这也是为什么上面代码只输出了一个“student”。
析构函数:
析构函数在对象销毁时自动调用,归还系统资源。
格式为:~类名()。
class Student { public: Student(){ cout << "Student" << endl; } ~Student(){ cout << "~Student" << endl; } private: string m_strName; };
析构函数的特性:
1.如果没有自定义的析构函数则系统自动生成
2.析构函数在对象销毁时自动调用
3.析构函数没有返回值,没有参数也不能重载
下面一段代码展示了析构函数的重要性。析构函数可以释放掉堆中的内存。
class Student { public: Student(){ m_pName = new char[20]; }//堆中申请了资源 private: char *m_pName; }; class Student { public: Student(){ m_pName = new char[20]; }//堆中申请了资源 ~Student(){delete []m_pName;}//释放内存 private: char *m_pName; };
相关文章推荐
- C++中析构函数需要定义成虚函数的原因
- C++中将基类的析构函数定义为虚函数
- C++ 析构函数 为何一般定义为虚函数
- C++中析构函数定义成虚函数的原因
- C/C++沉思-----多态时一定要将父类(基类)的析构函数定义为虚函数
- C++第十周【任务2】定义一个名为CPerson的类,有以下私有成员:姓名、身份证号、性别和年龄,成员函数:构造函数、析构函数、输出信息的函数。
- C/C++沉思-----多态时一定要将父类(基类)的析构函数定义为虚函数
- C++析构函数为什么要定义成虚函数
- C/C++沉思-----多态时一定要将父类(基类)的析构函数定义为虚函数
- C++中析构函数定义成虚函数的原因
- C++笔试题 关于函数析构函数未调用的问题
- 一劳永逸:关于C/C++中指针、数组与函数复合定义形式的直观解释
- 为什么要把父类的析构函数定义成虚函数
- C/C++笔试系列--默认参数在哪指定?函数声明还是定义?
- 为什么要把父类的析构函数定义成虚函数?
- C++中inline函数的定义为什么要放在头文件中?头文件中“只定义一份”是什么意思?const object 和inline函数是“一次定义规则”
- 在C中用struct实现C++中class的函数声明和定义
- C++箴言:避免析构函数调用虚函数
- C++中定义一个函数结束后自动释放的锁
- 为什么要把父类的析构函数定义成虚函数?