1.Static
Staic特点:只初始化一次,存在静态区,区别于Auto 变量,存在于栈中(函数结束,也就销毁)。
类内的staic:静态数据成员必须在类外初始化,静态成员函数只能调用静态变量,两者都不能用this指针调用。
2.Const
const int *a== int const* a a可变,a指向的对象不可变
int* const a : a不可变,指向对象可变
3.Switch
switch 的break 如果不写,就会在满足改条件的语句一直执行,直到break,或者函数结束;
4.为什么:
char str1*=“abc”;
char str*2=“abc”;
str1==str2成立? abc 存储在常量区域,大多数编译器都会把相同的常量只保持1份拷贝,所以str1和str2指向的地址是相同的。
5.Assert
Assert和assert的区别:前者在Debug版本中有,在Relase 版本不存在,而assert 都会存在;
#define NDEBUG 可以禁止调用宏;
6.enum
enum(a,b=1,c,d=2,e) == 0,1,2,2,3
7.argc和argv[]
(Test.c)int main (int argc,int*argv[]){.....}
命令行输入: Hong bi yue I
argv[]=[Test, Hong,bi,yue,I ];
argc=5;
8.main 函数结束后
main 函数结束后,如果还想继续执行代码,可以再析构函数里面执行
9.++
a.
*p++ : *p -> p++ 地址加;
(*p)++ : (*p)++ 值加;
b.
s++=5 :错误,先执行取a的地址,装入寄存器,然后临时变量为a的值加1,程序不允许对临时变量赋值;
++s=5 :正确,取a地址,内容+1,放入寄存器;
10.浮点数的注意事项:
float a,b,c;
1.if(a==0): 浮点数存在精度问题,不是一个确切的值,需要转化为:>= 或者<=;
2. a+b=b+a;
(a+b)+c 不一定等于 :(a+c)+b 浮点运算是不能被结合的 ------------???不懂
11.String 类实现注意点:
1.String :: String(const String &another)
{
char* m_data; //以调用strcpy()函数,故用指针
m_data= new char[strlen(another.m_data)+1]
strcpy (m.data,another.m_data);
}
12.extern 和 export
注:头文件中一般不定义变量,会引起重复定义,即使用 #ifdef,虽然头文件只被编译了一次,但是变量不只是会定义一次;
extren int n;
export template<class T> void f(T& t);
13 内存分配
(1)符号起始区块(BSS) :静态数据+ 未初始化的全局数据
(2)数据段: 静态内存分配,已初始化的全局数据
(3)代码段:程序执行代码
(4)堆 :动态分配的内存:malloc 和 new
(5)栈 :临时创建的局部变量
14.#include<>和“”
<>软件设置指定的路径 查找,如果有,直接加载;如果没有,报错(无法找到库文件)。
“ ”源代码文件(C或CPP文件)所在的文件夹;如果没有,就会在TurboC软件设置指定的路径 ,如果有,直接加载;如果没有,报错(无法找到库文件)。
15.struct 和class
struct 变量默认是public,而class 是private
16. sizeof()
1.为什么会有sizeof()?
在访问内存的过程中,地址总线总是按照对齐后的地址来访问,如果编译器对数据存储进行处理会加快读写速度
2.bool 2,int 4,char 2,类内函数为0,short 2,long 4,double 是8,int f()返回4,空类是1,多重继承的空类是1,虚继承的类是4(涉及虚指针)
32位系统 char是1位;
3.{bool a,int b,bool c}=3*4=12; {int a ;bool b,bool c}=2*4=8;
4.类内存放的静态变量是放在全局数据中的,在sizeof类时,只是计算栈的大小,所以不计算静态变量
5. char*s[100]="0123456789";
sizeof(ss)=100;strlen(ss)=10: strlen通过循环,检测到/0结束
17.数组指针和指针数组
int a[2][5] ={.......}; int(*b)[5] =a数组指针:*a=&a[0][0],**a=a[0][0];*a+1=&a[0][1];*(a+1)=&a[1][0];
18.向量容器:
顺序容器:队成员的顺序访问和随机访问 vector、list、deque
关联容器:经过优化关键值访问他们的元素 map是key-value形式,set是单值
set的含义是集合,它是一个有序的容器,里面的元素都是排序好的,支持插入,删除,查找等操作,就像一个集合一样。所有的操作的都是严格在logn时间之内完成,效率非常高。set和multiset的区别是:set插入的元素不能相同,但是multiset可以相同。Set默认自动排序。使用方法类似list。
19.多态:
1.覆盖:多态,面向对象,动态,编译期间并不能确定;重载:函数重载,静态,编译期可以确定,接口重用
2.定义 基类 Base对象 b 虚函数为show() b.show();可以调用虚函数Base::show();但是这种调用在编译时进行的是静态连编,没有充分利用虚函数的特性,只有通过基类指针访问虚函数是才能获得运行时的多态性。
3.虚函数不是必须重载的,但是虚基类(虚基类是为了只实例化一次基类存在的,孙子类继承父类,爷爷类,但是孙子还有叔叔,如果不用虚基类,孙子在继承爷爷类时,就认为有两个爷爷)必须重载
4.
20.友元函数
类内声明的函数,可以访问类内的private数据