C++强制转换
operator<type>(data)
- static_cast 简单类型转换,int,float间转换
- reinterpret_cast 在不改变实际数据的情况下改变数据的类型,初学者不易使用
- const_cast 把一个const类型的常量转换成一个非常量值,还可以转volatile的值为一个非volatile的值
- dynamic_cast 与类搭配使用
虚函数
处理未知类型的对象的方法。
virtual void func()
纯虚函数(抽象函数)
virtual void func() = 0;
多继承里的虚继承
C++虚函数表解析 C++对象的内存布局上 C++对象的内存布局下
声明成员函数为const的
template<class T> class Vector
{
public:
int length();
int length(int n);
// ...
}
template<class T>
int pad_length(const Vector<T>& v, int n)
{
int k = v.length(); // oops!
return k>n?k : n;
}
除非对length的声明中出现了const,否则标了oops!的行将不会编译通过,因为v是const引用的。
> 如果参数是const类型的,调用的函数也必须是const的??
复制函数
虚复制函数
操作系统
子进程是父进程的一个副本,它们的程序计数器具有相同的值,所以在调用fork之后两个进程将要招待的下一条语句都是一样的。
int pid = fork()
fork会返回两个值,把新创建的子进程的id返回给父进程,给新创建的子进程返回0(在子进程被存储在亦是pid中)。
如果fork函数调用失败,仅给父进程返回-1,并且不创建子进程。
子进程被创建为有自己的地址空间的父进程的一个副本,也就是存储进程执行所辅导书v人所有数据和信息的一个单独的内存区域。所以改变 子进程中的变量不会影响父进程中的相应的变量值,反之亦然,因为每个进程都有自己的地址空间。
进程间通信和管道
Basic
数组参数,用数组作为形参既不是传值调用也不是引用调用。
void fill(int a[], int size)
{
for(int i = 0; i < size; i++)
cin>>a[i];
}
int arr[5], num = 5;
fill(arr, num);
- 形参a[]的方括号里没有索引表达式,就算在数组参数的方括号中填入一个数字,编译器还是会忽略这个数不计
- 函数调用中给出的实参其后即没有方括号也没有索引表达式。
一个数组包含三部分:第一个索引变量的地址,数组的基本类型,数组大小。