C/C++教程

C++ - 初始化列表、友元、static成员

本文主要是介绍C++ - 初始化列表、友元、static成员,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录

一、初始化列表

二、static成员

三、友元


一、初始化列表

        初始化列表写在构造函数参数下面,用冒号开始,逗号分隔,每一个成员属性后用括号内的参数进行初始化。

class Date
{
public:
     Date(int year, int month, int day)
     : _year(year)
     , _month(month)
     , _day(day)
     {}
     
private:
     int _year;
     int _month;
     int _day;
};

        为什么使用初始化列表,是因为成员属性一个初始化的时机。如果是普通的int类型等不需要初始化的属性,可不用初始化列表。但若是const类型的属性需要在定义的时候就初始化好,这时我们就一定要使用初始化列表来初始化这类属性,包含引用成员变量 、const成员变量 、自定义类型成员(该类没有默认构造函数)。

class A 
{
public:
     A(int a)//没有默认构造函数
     :_a(a)
     {}
private:
     int _a;
};
class B 
{
public:
     B(int a, int b)
     :_a(a)
     ,_b(b)
     ,_c(1)
     {}
private:
     A a; // 没有默认构造函数
     int& b; // 引用
     const int c; // const 
};
        成员变量的初始化顺序与初始化列表写的顺序无关,与成员变量定义的顺序有关。上述B类中的初始化顺序就是a->b->c。

二、static成员

        在类中的属性前加static就是静态属性,在函数前加static就是静态成员函数。

        在类中设置静态变量_scount,该变量生命周期不会随着一个对象结束而结束,任意一个该类的对象都会操作该属性。而静态函数GetACount,任意不同的对象调用该函数都是一样的,也可以直接使用A::来调用函数。个人理解,静态的成员因为其生命周期在一个类中,相当于该类的不同对象共同使用。初始化要在类外。

class A {
public:
     A() {++_scount;}
     A(const A& t) {++_scount;}
     static int GetACount() { return _scount;}
private:
     static int _scount;
};
int A::_count = 0;
void TestA()
{
     cout<<A::GetACount()<<endl;
     A a1, a2;
     A a3(a1);
     cout<<A::GetACount()<<endl;
}

        c++11中支持非静态成员变量在声明时进行初始化赋值,但要注意这里不是初始化,而是为定义初始时提供一个缺省值。如果构造函数初始化列表中没有初始化,那么就会用这个默认值进行初始化。

class A
{
public:
private:
    // 非静态成员变量,可以在成员声明时给缺省值。
    int a = 10;
    static int n;
};
int A::n = 10;

三、友元

        由于c++中的封装特性,一个类的私有属性是其他函数或者类不能直接访问的。如果一定要访

问,可以将这些类或函数定义为友元函数或友元类。

class B
{};
class A
{
    friend void f();
    friend class B;
private:
    int _a;
};
void f()
{
    cout<< _a << endl;
}

        将B类和f()函数定义为A的友元类后,B和f()就可以访问A的私有属性。但需要注意的是,友元类只是一个单向的关系,A并不能访问B的私有属性。

        友元函数f()不能用const修饰。

这篇关于C++ - 初始化列表、友元、static成员的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!