1.extern
extern关键字用于在多个文件中引用同一个全局变量的声明
在一个头文件中,如果这个变量声明了,但是在cpp文件中没找到他的定义,那么编译就会报错,但是如果加了extern,编译器就不会给头文件报错,而是给cpp文件报错,如果函数没定义的话。或者定义出错的话。
2.关于反复调用简单函数的选择
在C中,我们使用define来定义这种函数,井号define是一种,文本替换的选择,就是默认的把一种文本转换成另外一种文本,方便快捷,但是不检查数据类型,所以可能出现意想不到的问题。
#include <stdio.h>#define SQUARE(x) ((x) * (x))int main() {int num = 5;printf("Square of %d is %d\n", num, SQUARE(num));return 0;
}
在C++中,可以直接把函数定义为内联函数,也就是inline,这样在编译的时候,编译器会直接把这个代码加入到代码中,避免了函数调用的开销。
#include <iostream>inline int square(int x) {return x * x;
}int main() {int num = 5;std::cout << "Square of " << num << " is " << square(num) << std::endl;return 0;
}
3.C++是类型安全吗
在上次的文章中,我提到了四种cast,这种类型转换中,reinterpret cast就是暴力转换,这种不考虑后果的转换很恐怖,很容易出问题。
4. 当一个类 A 中没有生命任何成员变量与成员函数,这时 sizeof(A)的值是多少,请解释一下编译器为什么没有让它为零。
为1而不是0,因为编译器仍然为他分配了一个地址来区分不同的类,也就是说,别看人家穷,人家是有编制的。
5.数组和指针在 C 和 C++ 中有几个关键的区别:
存储位置:
数组:在静态存储区(全局数组)或栈上(局部数组)分配内存,其大小在编译时确定。
指针:可以动态指向任意内存地址,其内存分配方式更灵活。
修改内容的区别:
对于数组,如 char a[] = “hello”;,可以修改内容(例如 a[0] = ‘X’;),因为它在可写的内存区域。
对于指针,如 char *p = “world”;,它指向一个常量字符串,试图修改 p[0] = ‘X’; 会导致未定义行为,通常是运行时错误,因为字符串字面量通常存储在只读内存中。
使用 sizeof 的差异:
对于数组,sizeof(a) 返回整个数组的字节数。
对于指针,sizeof§ 返回指针变量本身的字节数(通常是 4 或 8 字节),而不是指向的内存块的大小。指针本身并不存储它所指向内存的大小。