m(i)在以下程序中代表什么?C++

Cri*_*rsu 0 c++

我正在尝试学习一些OOP,我在理解以下程序时遇到问题:

#include<iostream>
#include<conio.h>
#include<string.h>
using namespace std;

class A
{
public:
    A(int i) : m(i){}

    friend class B;

    friend void g_afiseaza_m();
private:
    int m;
};

class B
{
public:
    void afiseaza_m()
    {
        A a(250);
        cout<<"clasa B este prietena cu clasa A"<<endl<<" poate accesa membrul privat A::m"<<endl<<a.m<<endl;
    }
};

void g_afiseaza_m()
{
    A a(300);
    cout<<"functia g_afiseaza_m nu este un membru al clasei A dar este prieten"<<endl<<"poate accesa membrul privat A::m"<<endl<<a.m<<endl;
}

int main()
{
    B b;
    b.afiseaza_m();
    g_afiseaza_m();
    getch();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

你能告诉我这行是做什么的:public:A(int i):m(i){} private:int m?我不认为A是带有int参数i的构造函数,并且m是A类的私有成员,但我无法理解什么是m(i)?这是语法问题吗?

ale*_*nis 6

将m(i)在构造函数初始化m值为成员i.

您的示例具有相同的结果(而不是行为)

A(int i) {
    m = i;
}
Run Code Online (Sandbox Code Playgroud)

在示例中使用初始化列表初始化成员更有效,因为使用参数直接调用成员的构造函数,i而在上面的示例中,m调用空构造函数然后 m赋值i.


Luc*_*ore 5

这是一个构造函数初始化列表,它m使用指定的值初始化类的成员.

它可以防止初始化,然后在某些情况下立即分配(不是这里).

某些成员只能在初始化列表中初始化 - const成员,引用成员,不是默认构造的类型.


Naw*_*waz 5

A(int i) : m(i) {}
         ^^^^^^ this is called member-initialization list.
Run Code Online (Sandbox Code Playgroud)

这m(i)意味着m正在初始化i.

如果您有更多的成员,比如说x,y在你的类,那么你可以这样写:

A(int i) : m(i), x(i*10), y(i*i) {}
Run Code Online (Sandbox Code Playgroud)

因此,在进入构造函数体之前,所有3个成员都已初始化.

有关详细解答,请参阅以下主题: