牛客 C++刷题day30&31&32

1.在我们进行机内数字运算的时候,一定要遵循这样的规则:先转化为补码,然后进行加法运算,最后将结果从补码转化为原码,得到结果。当然需要注意的是例如像int的最小值-2147483648,这个值完全是计算机为了减少+-0的歧义性而定义下来的数字。需要特别注意。

2.其实刚刚fork出来不止虚拟地址一样,物理地址也一样。当进程发生分歧时,即修改此变量时,才会分配不同的物理地址,也就是copy-on-write,写时复制。

3.结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的"最宽基本类型成员"的整数倍.不足的要补齐.  每个变量的起始位置地址要是该变量的大小的整数倍,不足的在之前补齐。

4.委托构造函数:

我们建议让类X的某个构造函数(称为“委托构造函数delegating constructor”)可以在初始化列表中调用同类的另一个构造函数(称为“目标构造函数target constructor”)。即委托构造函数把对象的初始化委托给另一个构造函数,然后再取回控制并执行其它的操作。一个委托构造函数也可以是另一个委托构造函数的目标构造函数。

例如:

class X {

int i_;

public:

X( int i ) : i_(i) { }

X() : X(42) { } // i_ == 42

};

规则如下:

l         允许外联形式的定义(见下例)。

l         最多只能有一个目标构造函数。如果在初始化列表中有一个同类的构造函数,则该初始化列表中不能再有其它东西(即不允许有其它基类或数据成员的初始化)。目标构造函数采用通常的重载决议和模板参数推断来选择。

l         目标构造函数还可以再委托给另一个构造函数。如果存在递归循环(如,构造函数C1委托给另一个构造函数C2,而C2又委托给C1),则行为未定义。不要求编译器检查这种情况,因为构造函数可以定义在不同的编译单元中,检查这种递归循环通常要耗费大量的编译时间。当然编译器如果能够进行检查,也是被鼓励的。

l         委托构造函数体中的语句在目标构造函数完全执行后才被执行。目标构造函数体中的局部变量不在委托构造函数体中起作用。

l         对象的生命期从任意一个构造函数执行完毕开始(对于委托构造的情况,就是最终的目标构造函数执行完毕时)。[C++03] §3.8中所写的“构造函数调用结束”是指任意一个构造函数。这意味着从委托构造函数体中抛出异常将导致析构函数的自动执行。

5.文件读写操作

以out方式打开打开文件做写操作,删除已有数据;out|trunc,与out模式相同。也即是在out模式中trunc是默认的。只要写出操作进行时碰到相同的文件,即会清空文件再创建,然后再写出。

6.const成员函数的一些说法

关于const函数的一些内容:
    c++的const函数特点:

1. 不能在const函数中修改所在类的对象的数据,因为const函数中的*this是常量,同样只能访问const函数;

2. const函数中只能调用其他的const函数,不能调用非const函数,因为对象调用函数是需要传递对象自己,const函数中的*this是常量,非const函数中的*this是变量,因此不可以调用(除非去除*this的const属性);

Note:使用const_cast后,可以在const函数中调用非const函数的

3. const函数与同名的非const函数是重载函数;

4. const对象只能调用const函数 ,但是非const对象可以调用const函数。

猜你喜欢

转载自www.cnblogs.com/Tonarinototoro/p/11618986.html