您当前的位置: 首页 >  c++

RuiH.AI

暂无认证

  • 4浏览

    0关注

    274博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

C++学习 十四、类的进阶(4)成员初始化列表,类内初始化,静态成员,嵌套结构

RuiH.AI 发布时间:2022-02-18 14:13:01 ,浏览量:4

C++学习 十四、类的进阶(4)成员列表初始化,类内初始化,静态成员,嵌套结构
  • 前言
  • 成员初始化列表
  • 类内初始化
  • 静态成员
    • 静态数据成员
    • 静态成员函数
    • 静态成员总结
  • 嵌套结构

前言

本篇类的进阶学习包括,成员列表初始化,类内初始化,静态成员,嵌套结构。

成员初始化列表

之前的构造函数,是在函数内部代码块中初始化成员。

那么就会出现const成员,引用成员的初始化问题,对于下面这个类声明:

class A{
    private:
        int a_;
        double b_;
        const float c_;
        long& d_;
    public:
        A(int, double, float, long&);
};

如果还是在构造函数的代码块中初始化成员:

A::A(int a, double b, float c, long& d){
    a_ = a;
    b_ = b;
    c_ = c;
    d_ = d;
}

将报rror: assignment of read-only member 'A::c_' c_ = c;error: uninitialized reference member in 'long int&',原因是const常量和引用变量必须在创建的同时初始化。

初始化成员列表能够在创建成员进行初始化,语法为: 类名::构造函数名(参数列表): 成员(参数), 成员(参数) {}

示例如下:

A::A(int a, double b, float c, long& d): 
a_(a), b_(b), c_(c), d_(d) {}

也可以把部分成员放在代码块内,部分放在成员初始化列表中:

A::A(int a, double b, float c, long& d):  c_(c), d_(d) {
	a_ = a;
	b_ = b;
}

成员初始化列表在对象创建时,初始化成员。

注意:成员初始化列表只能用于构造函数。当类声明中出现非静态const成员或者引用成员,必须使用成员初始化列表。

类内初始化

在创建对象时,系统才会为成员开辟内存。因此,在类声明中不能为成员提供初始值。

但C++11新特性允许在类声明中为成员提供默认初始值:

class A{
    private:
        int a_ = 0;
        double b_ = 0.;
        const float c_ = 0.f;
        long& d_;
    public:
        A(int, double, float, long&);
};

C++11的类内初始化,等价于在构造函数中使用成员初始化列表。为成员分配内存仍然是在创建对象时完成的。

如果创建对象的构造函数时也使用了成员初始化列表,则构造函数中的成员初始化列表值将覆盖类内初始化的默认值。

静态成员

类中带static关键字的成员就是静态成员。

静态成员包括静态数据成员,静态成员函数。

静态数据成员与其它静态变量放在一起,程序运行时即被创建,由所有该类对象共享。如果访问权限公有,则可以直接在程序中访问。

静态成员函数没有this指针,因此不能调用对象的非静态成员,也不能使用非静态成员函数。

静态成员示例如下:

//declare_class.h
class A{
    private:
        int a_ = 0;
        double b_ = 0.;
        const float c_ = 0.;
        long& d_;
        // static int e_ = 1; // error!
 		static const int e_ = 1;
    public:
    	static int num;
        A(long&);
        void printA();
        
        static void printNum();
};
//define_class.cpp
#include "declare_class.h"

int A::num = 0;

A::A(long& d): d_(d)
{
    num++;
}

void A::printA(){
    std::cout             
关注
打赏
1658651101
查看更多评论
0.0577s