首页 > 试题广场 >

在声明类时,下面的说法正确的是()?

[不定项选择题]

在声明类时,下面的说法正确的是()

  • 可以在类的声明中给数据成员赋初值(c++11新标准)
  • 数据成员的数据类型可以是register
  • private、public、protected可以按任意顺序出现
  • 没有用private、public、protected定义的数据成员是公有成员
1、register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度。例如下面的内存块拷贝代码,

/* Procedure for the assignment of structures, */

/* if the C compiler doesn't support this feature */

#ifdef NOSTRUCTASSIGN

memcpy (d, s, l)

{

register char *d;

register char *s;

register int i;

while (i--)

*d++ = *s++;

}

#endif

 

2、但是使用register修饰符有几点限制

(1)register变量必须是能被CPU所接受的类型。

这通常意味着register变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。不过,有些机器的寄存器也能存放浮点数。

(2)因为register变量可能不存放在内存中,所以不能用“&”来获取register变量的地址。

(3)只有局部自动变量和形式参数可以作为寄存器变量,其它(如全局变量)不行。

在调用一个函数时占用一些寄存器以存放寄存器变量的值,函数调用结束后释放寄存器。此后,在调用另外一个函数时又可以利用这些寄存器来存放该函数的寄存器变量。

(4)局部静态变量不能定义为寄存器变量。不能写成:register static int a, b, c;

(5)由于寄存器的数量有限(不同的cpu寄存器数目不一),不能定义任意多个寄存器变量,而且某些寄存器只能接受特定类型的数据(如指针和浮点数),因此真正起作用的register修饰符的数目和类型都依赖于运行程序的机器,而任何多余的register修饰符都将被编译程序所忽略。

 

注意:

早期的C编译程序不会把变量保存在寄存器中,除非你命令它这样做,这时register修饰符是C语言的一种很有价值的补充。然而,随着编译程序设计技术的进步,在决定哪些变量应该被存到寄存器中时,现在的C编译环境能比程序员做出更好的决定。实际上,许多编译程序都会忽略register修饰符,因为尽管它完全合法,但它仅仅是暗示而不是命令。
--------------------- 
作者:21aspnet 
来源:CSDN 
原文:https://blog.csdn.net/21aspnet/article/details/257511?utm_source=copy 
版权声明:本文为博主原创文章,转载请附上博文链接!

发表于 2018-10-12 19:38:33 回复(1)
        有没有题友质疑答案的,我觉得A是不对的。即使现在的C++11标准准许赋值,但是不是说有的都可以,题目中也没有对条件加以限制。如果我没有记错静态成员是不可以在类内赋值的,只能是类内定义,类外赋值,例如:
class A
{
public:
    int a = 33;        // 正确,C++11标准
    static int b = 33; // 应该会报错,因为静态成员变量只能是类外赋值
}

发表于 2018-06-11 09:34:57 回复(6)
A中的答案似乎有问题。 static变量没有办法在类中被赋值。 register并不是数据类型,而是作为一种命令修饰符。 public, private, protected这三个关键词,对类成员访问和在基类继承时进行的 访问模式限定符 。什么都不加,默认就是private。
编辑于 2018-10-27 23:54:20 回复(0)

——register 关键字

register 关键字请求“编译器”将局部变量存储于寄存器中——最快的关键字

register 这个关键字请求编译器尽可能的将变量存在CPU内部寄存器,而不是通过内存寻址访问(不能用&),以提高效率注意是尽可能,不是绝对


因为,如果定义了很多register变量,可能会超过CPU的寄存器个数,超过容量。所以只是可能。

数据从内存里拿出来先放到寄存器,然后CPU 再从寄存器里读取数据来处理,处理完后同样把数据通过寄存器存放到内存里,CPU 不直接和内存打交道。

速度!就是因为速度。寄存器其实就是一块一块小的存储空间,只不过其存取速度要比内存快得多。

进水楼台先得月嘛,它离CPU 很近,CPU 一伸手就拿到数据了,比在那么大的一块内存里去寻找某个地址上的数据是不是快多了?


举例:

register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度。例如下面的内存块拷贝代码,

1
2
3
4
5
6
7
8
9
10
#ifdef NOSTRUCTASSIGN
memcpy (d, s, l)
{
        register char *d;
    register char *s;
    register int i;
    while (i--)
        *d++ = *s++;
}
#endif

但是使用register修饰符有几点限制。

1.register变量必须是能被CPU所接受的类型。这通常意味着register变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。不过,有些机器的寄存器也能存放浮点数。

2.因为register变量可能不存放在内存中,所以不能用“&”来获取register变量的地址。由于寄存器的数量有限,而且某些寄存器只能接受特定类型的数据(如指针和浮点数),因此真正起作用的register修饰符的数目和类型都依赖于运行程序的机器,而任何多余的register修饰符都将被编译程序所忽略。在某些情况下,把变量保存在寄存器中反而会降低程序的运行速度。因为被占用的寄存器不能再用于其它目的;或者变量被使用的次数不够多,不足以装入和存储变量所带来的额外开销。

3.早期的C编译程序不会把变量保存在寄存器中,除非你命令它这样做,这时register修饰符是C语言的一种很有价值的补充。然而,随着编译程序设计技术的进步,在决定那些变量应该被存到寄存器中时,现在的C编译环境能比程序员做出更好的决定。实际上,许多编译程序都会忽略register修饰符,因为尽管它完全合法,但它仅仅是暗示而不是命令

C++编译器有自己的优化方式,即使不使用register关键字编译器也会自动优化。

比如我们定义一个循环变量,

1
2
3
4
for(int i; i<100;i++)
{
i *= i;
}
C++编译器会自动把变量 i 化成register类型,加快运算速度。

发表于 2020-08-12 22:23:59 回复(0)
发表于 2019-03-18 17:32:25 回复(0)
A选项:在C++11标准中是可以的,即 **类内初始值**,执行默认初始化的时候,可以用 类内初始值进行初始化;
class A
{
public:
    int a = 33;
};

发表于 2018-05-27 10:47:25 回复(8)
A选项:static变量只能在类外赋初值;
D选项:默认是private
发表于 2022-02-19 12:56:44 回复(0)