2020年4月6日 下午11:30
strcpy和strlen
- Strcpy是字符串拷贝函数,原型:
char *strcpy(char* dest, const char *src);- 从src逐字节拷贝到dest,直到遇到’\0’结束,因为没有指定长度,可能会导致拷贝越界,造成缓冲区溢出漏洞,安全版本是strncpy函数。
- Strlen函数是计算字符串长度的函数,返回从开始到’\0’之间的字符个数。
全局变量和静态全局变量的区别

关于int、short int、long int、long long 的区别
关于int、short int、long int、long long 的区别_C/C++_Adrianna的专栏-CSDN博客
- 在标准中,并没有规定long一定要比int长,也没有规定short要比int短。
- 标准是这么说的:长整型至少和整型一样长,整型至少和短整型一样长。
- short int 2个字节
- int 2/4字节
- long 4/8字节
- long long 8字节
从双刃剑的角度去总结
C++中类的(static)静态成员变量与(static)静态成员函数_C/C++_年少轻狂,幸福时光-CSDN博客
static能怎样,不能怎样
typedef vs define
#define是 C 指令,用于为各种数据类型定义别名,与 typedef 类似,但是它们有以下几点不同:- typedef 仅限于为类型定义符号名称,
#define不仅可以为类型定义别名,也能为数值定义别名,比如您可以定义 1 为 ONE。 - typedef 是由编译器执行解释的,
#define语句是由预编译器进行处理的。
++i和i++的实现
- ++i 实现:
1
2
3
4
5int& int::operator++()
{
*this +=1;
return *this;
} - i++ 实现:
1
2
3
4
5
6const int int::operator(int)
{
int oldValue = *this;
++(*this);
return oldValue;
}
类型转换
- C++风格的强制转换其他的好处是
- C++中风格是static_cast
(content)。C++风格的强制转换其他的好处是,它们能更清晰的表明它们要干什么。程序员只要扫一眼这样的代码,就能立即知道一个强制转换的目的。
- C++中风格是static_cast
- reinterpret_cast:重解析类型转换
- 可以用于任意类型的指针之间的转换,对转换的结果不做任何保证
- dynamic_cast:
- 这种其实也是不被推荐使用的,更多使用static_cast,dynamic本身只能用于存在虚函数的父子关系的强制类型转换,对于指针,转换失败则返回nullptr,对于引用,转换失败会抛出异常
- 可以动态的来判断当前对象的真实类型
- const_cast:
- 对于未定义const版本的成员函数,我们通常需要使用const_cast来去除const引用对象的const,完成函数调用。
- 另外一种使用方式,结合static_cast,可以在非const版本的成员函数内添加const,调用完const版本的成员函数后,再使用const_cast去除const限定。
- static_cast:
- 能使用隐式转换的地方,均可以使用static_cast转换
- 如果类型不兼容,使用static_cast编译检查,会报错,不用等到运行阶段
说说你了解的RTTI
运行时类型检查,在C++层面主要体现在dynamic_cast和typeid,VS中虚函数表的-1位置存放了指向type_info的指针。对于存在虚函数的类型,typeid和dynamic_cast都会去查询type_info
struct和class的区别
- 默认的继承访问权:【继承下】
- class默认的是private,strcut默认的是public。
- 当然,到底默认是public继承还是private继承,取决于子类而不是基类。意思是,struct可以继承class,同样class也可以继承struct,那么默认的继承访问权限是看子类到底是用的struct还是class。
- 成员变量默认访问权限:【非继承下】
- struct作为数据结构的实现体,它默认的数据访问控制是public的,而class作为对象的实现体,它默认的成员变量访问控制是private的。
- 有代码实验:【C++】struct和class的区别_C/C++_alidada_blog的博客-CSDN博客
C++中可以定义引用数据成员吗?
C/C++ - 类中成员变量是引用_C/C++_lazyq7的博客-CSDN博客
- 所有的引用自带要求,并不一定是在类中:
- 引用在定义时必须初始化,否则编译时便会报错。
- 根据1,我们可以推得在类中,如何使用引用数据成员:
- 构造函数:
- 引用类型的成员变量的类,不能有缺省构造函数
- 不能直接在构造函数里初始化,必须用到初始化列表
- 默认构造函数没有对引用成员提供默认的初始化机制,也因此造成引用未初始化的编译错误。
- 构造函数: