C++的类的初始化问题

ProcessState::ProcessState()  //继承并初始化

    : mDriverFD(open_driver())----->Android很多代码都是这么写的,稍不留神就没看见这里调用了一个很重要的函数

    , mVMStart(MAP_FAILED)//映射内存的起始地址

    , mManagesContexts(false)

    , mBinderContextCheckFunc(NULL)

    , mBinderContextUserData(NULL)

    , mThreadPoolStarted(false)

    , mThreadPoolSeq(1)

{

if (mDriverFD >= 0) {

//BIDNER_VM_SIZE定义为(1*1024*1024) - (4096 *2) 1M-8K

        mVMStart = mmap(0, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE,

 mDriverFD, 0);//这个需要你自己去man mmap的用法了,不过大概意思就是

//将fd映射为内存,这样内存的memcpy等操作就相当于write/read(fd)了

    }

    ...

}

初始化列表初始顺序

#include <iostream>
using namespace std;

class Base 
{
    public:
    Base(int i) : m_j(i), m_i(m_j) {}
    Base() : m_j(0), m_i(m_j) {}
    int get_i() const
        {
        return m_i;
        }
    int get_j() const
        {
        return m_j;
        }

    private:
    int m_i;
    int m_j;

};

int main()
{
Base obj(98);
cout << obj.get_i() << endl << obj.get_j() << endl;
return 0;
}

输出为一个随机数和98,为什么呢?因为对于初始化列表而言,对成员变量的初始化,
是严格按照声明次序,而不是在初始化列表中的顺序进行初始化,
如果改为赋值初始化则不会出现这个问题,当然,为了使用初始化列表,还是严格注意声明顺序吧,比如先声明数组大小,再声明数组这样。

C++构造函数初始化按下列顺序被调用:

首先,任何虚拟基类的构造函数按照它们被继承的顺序构造;
其次,任何非虚拟基类的构造函数按照它们被继承的顺序构造;
最后,任何成员对象的构造函数按照它们声明的顺序调用;

#include <iostream>
using namespace std;
class OBJ1{
    public:
    OBJ1(){ cout<<"OBJ1\n"; }
};
class OBJ2{
    public:
    OBJ2(){ cout<<"OBJ2\n";}
}
class Base1{
    public:
    Base1(){ cout<<"Base1\n";}
}
class Base2{
    public:
    Base2(){ cout <<"Base2\n"; }
};
class Base3{
    public:
    Base3(){ cout <<"Base3\n"; }
};
class Base4{
    public:
    Base4(){ cout <<"Base4\n"; }
};
class Derived :public Base1, virtual public Base2,public Base3, virtual public Base4//继承顺序{
    public:
    Derived() :Base4(), Base3(), Base2(),Base1(), obj2(), obj1(){//初始化列表
    cout <<"Derived ok.\n";
}
protected:
OBJ1 obj1;//声明顺序
OBJ2 obj2;
};

int main()
{
Derived aa;//初始化
cout <<"This is ok.\n";
return 0;
}
打印结果:
Base2 //虚拟基类按照被继承顺序初始化
Base4 //虚拟基类按照被继承的顺序 
Base1 //非虚拟基类按照被继承的顺序初始化
Base3 //非虚拟基类按照被继承的顺序 
OBJ1 //成员函数按照声明的顺序初始化
OBJ2 //成员函数按照声明的顺序 
Derived ok. 
This is ok.
引用

#include <iostream>
using namespace std;
class Time
    {public :
    int hour;
    int minute;
    int sec;
};
int main( )
{
    void set_time(Time&);//函数声明
    void show_time(Time&);//函数声明

    Time t1;//定义t1为Time类对象
    set_time(t1);//调用set_time函数,向t1对象中的数据成员输入数据
    show_time(t1);//调用show_time函数,输出t1对象中的数据
    Time t2;//定义t2为Time类对象
    set_time(t2);//调用set_time函数,向t2对象中的数据成员输入数据
    show_time(t2);//调用show_time函数,输出t2对象中的数据
    return 0;
}
void set_time(Time& t) //定义函数set_time,形参t是引用变量
{
    cin>>t.hour;//输入设定的时间
    cin>>t.minute;
    cin>>t.sec;
}
void show_time(Time& t) //定义函数show_time,形参t是引用变量
{
    cout<<t.hour<<″:″<<t.minute<<″:″<<t.sec<<endl;//输出对象中的数据
}

猜你喜欢

转载自blog.csdn.net/alifrank/article/details/82586724