0%

C++虽然集成了C语言的explict cast和implict cast策略,但是作为一门更现代的语言,C++额外提供了一些类型检查,如检查指针和基础类型的转换,基类和派生类的转换等来提高编程的安全性。
主要有const_cast,reinterpret_cast,static_cast,dynamic_cast。其中const_cast主要用于处理const修饰,功能单一,可以看作一类,其他三类可以看作另一类。

const_cast

const_cast一般用于强制修改一个类型的读写权限,例如实现常量到变量引用的转换,以实现修改一些常量的目的。强制转换的类型必须是指针或引用。

const int v = 1;
int &mutv = std::const_cast<int&>(v);
mutv++;

const int *p = 1;
int *mutp = std::const_cast<int*>(p);
(*mutp)++;

阅读全文 »

引子

声明一个模板函数func(),在main()中调用它:

template<typename T>
int func(T&& v)
{
return v;
}

main()中调用它:

int main()
{
int a = 1;
func<int>(a); // compile error
func<int>(std::move(a));
return 0;
}

可以看到func<int>(a)这一行编译报错:error: cannot bind rvalue reference of type ‘int&&’ to lvalue of type ‘int’,原因显而易见:int func(T&& v)被特化成了int func(int&& v),只接受右值。
阅读全文 »

我们先来看一个matrix类在C++中如何实现:

class matrix {
private:
int nrow, ncol;
double** value;

public:
matrix(int r, int c);
};

首先定义字段,在matrix中定义了行数nrow和列数ncol,以及指向存储数据的指针value。然后定义构造函数matrix int r, int c)。由于matrix有一个指针字段value,指向的数据需要在堆上动态分配,所以matrix类型的对象在拷贝时需要注意深浅拷贝的问题,在栈上对象离开作用域则需要考虑析构的问题,所以我们还需要显式地或隐式地指定了matrix类型的对象在拷贝赋值销毁时的行为。

阅读全文 »

inode

硬盘的最小存储单位是扇区(Sector),块(Block)由多个扇区组成。文件数据存储在块中。块的最常见的大小是4Kb,约为8个连续的扇区组成(每个扇区存储512字节)。计算机的内存是基于字节编址的,就像一个文件可能会占用多个Block,但是一个块只能存放一个文件。

虽然,我们将文件存储在了块(Block)中,但是我们还需要一个空间来存储文件的元数据(Meta Data),如:某个文件被分成几块、每一块在的地址、文件拥有者,创建时间,权限,大小等。这种存储文件元信息的区域就叫inode,译为索引节点(Index Node)。 每个文件都指向一个inode,存储文件的元信息。

阅读全文 »