我有以下代码:
#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)。
对不起,如果这听起来很愚蠢也无法理解。
答案 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)
您似乎有多个问题:
struct不是子类化I
,它只是使用Initialization Lists来构造I变量。构造函数S(int i) { I = i;}
也可以这样做。
它已在构造函数中分配,请参阅#1。
您对引用和指针感到困惑。引用假装像常规值传递的数字一样。使用int *
等函数返回int * v () { return &I; }
的指针将打印出变量的地址,除非您使用*符号取消引用它们。引用会自动取消引用。
答案 2 :(得分:0)
没有任何子类。我建议你选一本好的C ++书并阅读一下。 C ++中的类(或结构)具有访问说明符public
,protected
和private
,它们控制对说明符后面的所有内容的访问级别:
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
{ /* ... */ };