初始化列表和静态成员

210 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

初始化列表

传统赋值初始化是相当于先声明类后作赋值操作,而初始化列表相当于直接声明一个有初始值的类型,省略了赋值操作。在大型项目中,class类中的成员变量多的情况下,初始化效率更高。

固定值初始化列表

#include <iostream>
#include <string>
using namespace std;
​
class Student
{
    public:
        string m_name;  // 定义成员属性
        int m_age;
        int m_score;
        Student():m_name("Mike"),m_age(19),m_score(80){}  // 定义初始化列表
}
​
int main(void)
{
    Student s;
    cout << "Name:" << s.m_name << " Age:" << s.m_age << " Score:" << s.m_score << endl;
    return 0;
}
// 输出 Name:Mike Age:19 Score:80

传参初始化列表

class Student
{
    public:
        Student(string name,int age,int score):m_name(name),m_age(age),m_score(score){}
}
​
Student s("Mike",20,99); // 初始化对象时候传参

静态成员变量

  • 静态成员变量

    • 所有对象共享一份数据
    • 在编译阶段分配内存
    • 类内声明,类外初始化

声明静态变量并初始化*

class Student
{
    public:
        static int m_age;  // 类内声明静态变量  
};
​
int Student::m_age = 20;  // 类外初始化  

*私有静态成员变量

class Student
{
    static string m_name; // 类内声明私有静态变量
}
​
int Student::m_name="Mike";  // 类外初始化
// cout << Student::m_name << endl; 因为是私有变量所以无法访问

*访问静态成员变量的方式

// 通过对象进行访问
Student s;
cout << s.m_age << endl;
​
// 通过类名进行访问
cout << Student::m_age << endl;
// using namespace std;的作用就是如此 不然使用cout函数需要  std::cout << std::endl;

静态成员函数

  • 静态成员函数

    • 所有对象共享同一个函数
    • 静态成员函数只能访问静态成员变量

声明静态成员函数

class Student
{
    public:
        static void coutString()
        {
            cout << "静态成员函数调用" << endl; 
        }   
};

私有静态成员函数

private:
    static void coutString2()  // 声明私有静态成员函数
    {
        cout << "静态私有成员函数调用" << endl;
    }
​
Student::coutString2();  // 与私有静态变量一样,无法调用
// [Error] 'static void Student::coutString2()' is private

调用静态成员函数的方式

// 通过实例化对象调用
Student s;
s.coutString();
​
// 通过类名进行调用
Student::coutString();

静态成员函数只能访问静态成员变量

class Student
{
    public:
        static string s_name;  // 静态成员变量 
        int m_age; // 非静态成员变量[局部变量] 
        
        static void coutString()  // 静态成员函数 
        {
            s_name="Mike"; // 访问静态成员函数 
            // m_age=19;  尝试修改局部变量
            // [Error] invalid use of member 'Student::m_age' in static member function
            
            cout << "静态成员函数调用 " ;   
            cout << "Name: " << s_name ;
        }   
};
​
string Student::s_name="***";  // 初始化静态成员变量 

为什么静态成员函数无法修改非静态函数变量,只能访问静态成员变量?这是因为静态成员在编译过程中就已经分配内存,是唯一的(静态成员对象共享同一份数据);而非静态变量是不唯一的,编译器无法判断静态成员函数中修改的是哪一个非静态成员变量的值,因此产生异常

image.png