结构体是一种值类型,而类是引用类型
结构体用栈存储,而类的静态对象使用栈存储,动态用堆
结构体内默认权限是public,类默认为private
结构是无法被继承的,类则可以
如何定义一个只能在堆上(栈上)生成对象的类?
struct和union都包含多个成员,但 union 中起作用的是最后一次存放的成员,每次只能赋一种值, 赋入新值则冲去旧值
strcpy只能用于字符串,遇到 ’/0‘ 会停止,
strcpy和memcpy主要有以下3方面的区别。
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符**"\0"才结束**,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。因此strcpy会复制字符串的结束符“\0”,而memcpy则不会复制。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy
1.表明某个变量的值可能在外部被改变,因此对这些变量的存取不能缓存到寄存器,每次使用时需要到内存重新存取。
2.在多线程,多任务或多中断的环境下,变量可能被其他的程序改变,编译器自己无法知道,volatile会使程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据,而不是从寄存器中读取。
3.在linux中,可以使用-O进行优化,volatile可以保证变量不被优化,避免发生错误。
4.volatile变量间的操作,不会被编译器交换顺序
指针指向了一块随机的空间,不受程序控制。
原因:指针定义时未被初始化,指针被释放时没有置空,操作越界
C++11中允许将类标记为final,方法时直接在类名称后面使用关键字final,如此,意味着继承该类会导致编译错误
大端存储:数据的高位存储在低地址处
小端存储:数据的低位存储在低地址处(类似字符串转整数)
有的
左值:有名字的变量(对象),可以被赋值,可以取地址,可以复用
右值:临时变量(对象),不能被赋值
使用move() 函数可以调用移动构造函数,将某个左值强制转化为右值,相当于一个static_cast;
右值引用的作用:主要是避免了拷贝临时变量时额外的空间占用
全局对象的构造函数会在main 函数之前执行,
全局对象的析构函数会在main函数之后执行
#include
using namespace std;
class CTest
{
public:
CTest(){cout << "构造函数..." << endl;}
~CTest(){cout << "析构函数..." << endl;}
};
int main()
{
CTest t;
return 0;
}
所谓的段错误 就是指访问的内存超出了系统所给这个程序的内存空间
遇到较多的:数组越界;变量类型不一致;堆栈溢出
解决方案:cout打印关键位置;gdb调试
0.char *是一个指针,可以指向一个字符串数组
1.string是一个封装类,char属于基本类型
2.string的内存管理是由系统处理,char *的内存管理由用户自己处理
初始化建堆 : O(n)
排序重建堆 :O(nlogn)
是非静态成员函数的隐含形参,可以用来访问类中成员
数据的首地址的值是某个数k(通常它为4或8)的倍数
目的:加快cpu的访问速率,尽可能的从一块内存,一次获取到数据
CPU访问内存数据时会受到地址总线宽度的限制,内存对齐为了让CPU能一次获取到数据,从而提升性能
指针函数:是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针
函数指针: 是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针
函数指针的函数名带括号,指针函数不带
auto 可以自动推理数据类型。
auto不能用来定义数组或函数形参
抽象类:带有纯虚函数的类称为抽象类,可能有其它方法
接口类:如果一个类里面只有纯虚函数,没有其他成员函数和数据成员,就是接口类