CC++知识要点总结.png
一、数据类型及运算
求补码
原码的基础上,符号位不变,其余各位取反,最后+1原码转补码不考虑符号位补码转原码,符号位不参与运算取反后+1==取反前-1科学计数法表示
1.8*10^11--1.8E.34*10^-3--9.34E-3相关细节
sizeof()是一个运算,而非函数++运算不能用在实数上判断一个整数是否是2^n(2,4,6,8,16...)!(x(x-1))三目条件运算符代码更优编译器能产生比if...else...更优的代码运算符优先级、结合方向规则
单目双目算术关系位逻辑条件(三目)赋值逗号算术:+-*/关系:==位:
^单目:~逻辑:
单目:!自右向左的三种运算符单目赋值条件数据输入与输出
printf()语句从右向左计算输出表达式的值i=1;printf(%d,%d\\\\n,i++,i--);//res:0,1//先执行i--,再执行i++常用输出函数
printf()putchar()输出一个字符必须是字符型变量或常量puts()输出一个字符串必须是字符串或常量常用输入函数
scanf()gets()每次读取一个字符串getche()conio.h中读取字符不用按回车getchar()stdio.h中完成后须按回车getche()getchar():每次读取一个字符scanf()gets()区别:scanf不能输入含空格字符串,gets可以二、选择语句和循环语句
switch:case常量表达式
常量表达式只能为整型、字符型不允许浮点型三、数组
定义
定义数组未赋初值TurboC会给数组置0VC则取随机值定义静态数组,则系统自动赋0比较字符串数组中的值
C:
strcmp(str1,str2)C++:
str1==str2JAVA:
str1.equals(str2)java中,str1==str2比较的是地址四、指针
指针运算
指针相减:
表示两指针所指地址之间的数据个数指针相加:
没有意义,错误数组与指针
1、一维数组首地址
inta[10],*p;p=a[0];p=a//等价,将数组首元素的首地址赋给指针p表示:a[0],a:
数组首元素的首地址a:
数组首地址对比:a==a[0]a!=a
//地址值相同,含义不同2、二维数组首地址
inta[10][10];地址值相同,含义不同:
a:
二维数组首元素首地址代表一维数组元素的首地址a:
数组首地址a[0]:
二维数组首元素首地址a[0][0]:
a[0][0]!=aa[0]==a[0][0]3、二维数组指针
int(*p)[3]:指向含3个元素的二维数组的行指针数组每列有3个元素int\p[3]int\(p[3]):指针数组,每个元素均是一个指针指针与引用的区别
非空区别不能使用指向空值的引用不存在指向空值的引用效率比使用指针高引用必须总是指向某些对象指针可以指向空值合法性区别使用引用前,无需测试其合法性使用指针总是需要判空可修改区别总指向初始化时被指定的对象以后都不能改变但指定对象的内容可以改变指针可被重新赋值,以指向另一对象引用应用区别指向一个对象后就不会改变指向的情况存在不指向任何对象的情况不同的时刻指向不同对象的情况指针场景引用场景ps:声明引用/const常量的同时,必须初始化
函数指针
float(**def)[10];二级指针指向一个一维数组的指针数组元素都是floatdouble\(\gh)[10];指针gh,指向一个一维数组该数组元素的类型均为double*double(*f[10])();没有参数返回double类型的值元素都是函数指针f是一个数组,含10个元素指向的函数int\((\b)[10]);和int\(\b)[10]一样Long(*fun)(int)函数指针五、类型转换
(int)相关
floata=1.0f;(int)a实际上是以浮点数a为参数构造了一个整型数,该整数的值是1。(int)a则是告诉编译器将a当作整数看(并没有做任何实质上的转换)。unsignedint
unsignedinta=0xFFFFFFF7;unsignedchari=(unsignedchar)a;i:f7char\*b=(char*)a;*b:fffffff7隐式类型转换
算术运算式中,低类型能够转换为高类型赋值运算式右边表达式的值自动隐式转换为左边变量的类型,并赋值给他函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参函数有返回值时,系统将隐式地将返回表达式类型转换为返回值类型,赋值给调用函数六、位运算相关
取两数的平均值:
(xy)+[(x^y)1]另类取两数较大值:
max=[(a+b)+abs(a-b)]/2三数取中间数:
t1=max(a,b);t2=max(b,c);t3=max(a,c);min(t1,min(t2,t3))七、函数
静态函数:不可被其他文件调用的函数
函数重载:
参数类型不同参数个数不同对返回类型没有要求八、#defineconstsizeof
#define实例
*#defineSEC(60*60*24*)UL*#defineMIIN(A,B)((A)=(B)?(A):(B))const,#define的区别
const有数据类型可进行类型安全检查可对其进行调试\#define没有数据类型仅进行字符替换,没有类型安全检查无法调试c中const被当做一个不能被改变的普通变量errorconstbufsize=;charbuf[bufsize];字节对齐
数据对齐规则结构的首地址必须是结构内最宽类型的整数倍地址结构体的每一个成员起始地址必须是自身类型大小的整数倍结构体的整体大小必须可被对齐值整除结构体的整体大小必须可被本结构内的最宽类型整除sizeof
结构体或类内的静态变量structs{inta;staticintb;};sss;sizeof(ss)结果:4
静态变量存放在全局数据区sizeof计算栈中分配的大小任何类型指针大小相同:4(32位)对函数使用sizeof在编译阶段会被函数返回值的类型取代空类大小单继承:1多继承:1虚继承:4涉及虚表(虚指针)内联函数vs.宏
内联相比普通函数:加快程序运行速度直接嵌入目标代码要做参数类型检查宏简单的替换不做参数类型检查九、C++面向对象
1、类和对象
类对象的存储空间
只为每个对象的数据成员和函数地址分配内存空间类中所有成员函数只生成一个副本该类每个对象执行相同的函数成员拷贝构造函数
功能用一个已知的对象来初始化一个被创建的同类的对象特点函数只有一个参数,并且是对某个对象的引用每个类都必须有一个拷贝初始化构造函数格式类名::拷贝初始化构造函数名(const类名引用名)静态成员
静态数据成员类名::静态数据成员名类的所有对象共享必须初始化,且要在类外初始化特点引用格式静态成员函数类名::静态成员函数名类的所有对象共享只能使用类的静态成员和非数据成员特点引用格式类成员指针
const成员函数
定义:任何不修改成员数据的函数都应声明为const函数
原型:intGetY()const;
细节:
const函数想修改成员变量在相应变量定义处加上mutablemutableintm_Count;2、友元函数
定义
需在类体内声明可访问类的私有成员不是类的成员函数优点:
提高程序运行效率
缺点:破坏类的封装性和隐藏性
特点:可以是多个类的友元
3、继承和派生
公有继承
派生类成员函数可访问基类中的公有成员和保护成员派生类的对象仅可访问基类中的公有成员派生类
构造函数执行顺序基类构造函数子对象类的构造函数(如果有的话)派生类构造函数析构函数执行顺序派生类的析构函数基类的析构函数虚基类