Lession 10 静态成员、const成员、对象成员

来源:互联网 发布:windows桌面备份恢复 编辑:程序博客网 时间:2024/05/16 16:02

静态成员

:编译时申请内存,程序运行之后释放内存;内存地址属于全局域的静态区,不占用对象的内存


class A{public:A getA();    static A getSA(); static int psa; // 可以用类对象来访问 a.psa; 或是 A::psa;private:static int sa; // 不能用类对象来访问 a.sa;是错的,只能 A::sa;}//初始化,不用加staticint A::sa = 0;或 int A::sa;


静态数据成员:

1. 必须初始化,且只能在类外初始化;

2. 不能用构造函数对static成员变量初始化,只是赋值,静态数据成员属于类的,可以不用实例化对象的情况下就可以访问;(因为static是编译前在全局域分配内存空间,构造函数时只是给已经有内存的变量赋值)

3. 其它地方用要用类作用域运算符,公用时可以用a.sa来访问或是A::sa来访问。但如果是私有变量,则不能在其它地方直接用A::sa来访问,可以通过成员函数来访问

4.静态成员没有this指针


静态成员函数

静态成员函数是专门用来访问私有的静态数据成员变量,不能用来访问非静态数据成员(因为要实例化对象,如果没有则可能出错)


A demo;demo.getA();
// 如果不想声明对象,则函数前加static
A::getSA();


对象成员

:一个类里包含另一个类的对象(不能包含类自身,但可以包含类自身的引用与指针)

const 成员,子对象成员,引用成员必须用初始化列表来初始化

class A{public:</span>A(){};};class C</span>{// 如果是有参的构造函数,则必须用初始化列表C(int c){};}class B{public:A a;C c; // A C初始化的顺序是声明顺序A C与初始化列表的顺序无关B():c(2),a(){}; // C构造函数有参,不会生成默认构造函数,必须调用有参的;//a是无参构造函数,可以不加,c是有参构造函数,必须加上初始化列表中// 构造函数调用顺序: A C B:先调用子对象构造函数,子对象顺序是按声明顺序调用构造// 析构函数的调用顺序与构造函数的调用顺序相反:B C A!!}


const成员:const修饰的

常数据成员

class A{const string str; // 值不可以改变,一定要用到初始化列表}</span>



常成员函数

1.  声明定义都要用const修饰
2.  不得修改数据成员值,仅能访问
3. 静态的成员函数不得声明为const
4. const成员函数不能调用非const成员函数
5. 常对象调用常成员函数(如果发生重载时有:void f

un(); void fun() const(); 常对象会调用第二个)

class A{ public:void fu() const;  void noCnst();};    void A::fu() const  {  } 



常对象

const  A a;  // 常对象所有的数据成员是不可以改变的!!即都是只读变量
a.fu();   // const成员函数,可以
a.noCnst();  // 非const成员函数,可以调用!!

1. const对象只能引用const成员函数,因此非const函数里可能会改变变量的值
2. const对象可以引用const或非const成员变量 ,但都是只读,不能改变
 
mutable:修饰的变量:const对象下是可以改变的




0 0
原创粉丝点击