不明白变量I是如何在结构中赋值的

时间:2011-08-21 00:32:59

标签: c++

我有以下代码:

#include <iostream>
using namespace std;

struct S {
    S(int i): I(i) { }
    int & v () { return I; }
    private :
    int I;
};

S s1 (1);
int main() {

    cout << s1.v() << "\n";

    return 0;
}

我得到了输出:

1

我很困惑它是如何工作的。例如,使用s1它正在调用构造函数S(int i),但是如果没有I类,如何对I进行子类化并调用其构造函数,私有变量如何? I在没有分配号码的情况下获得号码?此外,如果v()返回int&(因此,我会认为它会打印出一个内存位置,但它会始终为1)。

对不起,如果这听起来很愚蠢也无法理解。

3 个答案:

答案 0 :(得分:3)

  

如果没有I类,它是如何对I进行子类化并调用它的构造函数的?如果没有为其分配任何数字,我如何为私有变量赋值?

语法

S(int i): I(i) { }

表示通过为成员S分配参数I的值来构造i。你可以这样实现它:

S(int i) { I = i; }

  

如果v()返回int&amp; (因此,我认为它会打印出一个内存位置,但它会一致地给出1。)

v引用的引用是对I的成员s1的引用。只要s1尚未解除分配,引用就是有效的。在代码s1中,它是一个静态变量,只有在程序退出时才会被释放。

答案 1 :(得分:2)

您似乎有多个问题:

  1. struct不是子类化I,它只是使用Initialization Lists来构造I变量。构造函数S(int i) { I = i;}也可以这样做。

  2. 它已在构造函数中分配,请参阅#1。

  3. 您对引用和指针感到困惑。引用假装像常规值传递的数字一样。使用int *等函数返回int * v () { return &I; }的指针将打印出变量的地址,除非您使用*符号取消引用它们。引用会自动取消引用。

答案 2 :(得分:0)

没有任何子类。我建议你选一本好的C ++书并阅读一下。 C ++中的类(或结构)具有访问说明符publicprotectedprivate,它们控制对说明符后面的所有内容的访问级别:

class A
{
  /* private by default */
public:
  /* public stuff */
private:
  /* private again */
};

struct B
{
  /* public by default */
private:
  /* private stuff */
public:
  /* public stuff again */
private:
  /* private stuff again */
};

您的班级S只包含一个私有成员int I,该成员由构造函数初始化为1,然后打印出来。


继承的语法是类声明中的冒号:

class  Foo : public Bar,
             protected FooBase,
             private SomeHelper
{ /* ... */ };