构造,析构与初始化列表

来源:互联网 发布:vb自动处理网页弹框 编辑:程序博客网 时间:2024/06/06 12:32

Default Constructor

  • A default constructor is one that can be called with no arguments.不带参数的构造函数就是默认的构造函数。
  • 当class没有constructor时,系统分配默认构造函数。
class B {public:    B(int i){}    B(){} //不带参数,为默认构造函数};

初始化列表

struct A {    int i;//由于A为struct,所以i为public    int *p;    B b;public:    A():p(0),b(0) {cout << "A::A()" << endl;}//这里的A():p(0),b(0)就是一个初始化列表    ~A() {if (p) delete p; cout << "A::~A()" << i << endl;}    void set(int i) {this->i = i;}    void f() {p = new int;}    void g(A* q) {cout << "A::g(), q->i=" << q->i << endl;}};

struct和class的区别

  • class中的成员变量,如果不作类型限制的话,默认是private
  • struct默认是public

初始化列表在constructor之前调用

  • 建议:类的所有成员变量都在initialzation中做初始化,而不要在构造函数中做赋值
  • 父类的constructor放到参数列表中

当初始化列表中有对象时,调用constructor初始化该对象

class Person{private:    string name;public:    void print();    Person(string aname){name = aname;}    Person():name("universe"){}//默认constructor,初始化name为"universe"};void Person::print() {    cout << "Person's name is " << name << endl;}class A {private:    int i;    Person man;public:    A():i(0),man("time"){cout << "A(), i = " << i << endl;}//初始化man时,调用man的constructor    ~A(){cout << "~A(), i = " << i << endl;}    void print();};

一个实例

#include <iostream>using namespace std;class B {public:    B(int i) {}    //B() {}//默认构造函数};struct A {    int i;    int *p;    B b;public:    A():p(0) {b = 0; cout << "A::A()" << endl;}     ~A() {if (p) delete p; cout << "A::~A()" << i << endl;}    void set(int i) {this->i = i;}    void f() {p = new int;}    void g(A* q) {cout << "A::g(), q->i=" << q->i << endl;}};int main(){    A* p = new A[10];    for (int i = 0; i < 10; i++) {        p[i].set(i);    }    A b;}

编译,提示error

Error - constructor for ‘A’ must explicitly initialize the member ‘b’ which does not have a default constructor

有两种修改方法

  1. 给class B添加默认构造函数
  2. A的构造函数A():p(0) {b = 0; cout << "A::A()" << endl;}之前添加b的初始化
A():p(0),b(99) {b = 0; cout << "A::A()" << endl;}
0 0
原创粉丝点击