6/12
整数不大时所占字节为4个字节(该整数不为变量)
当visual c提示找不到文件时,可能是所创建的程序类型错误,应改换另一种类型的程序
6/13
用float定义变量时,数值后最好加f
如:float f1=4.12f;
用double定义变量时,数值后一般不加字母
如:double d1=4.03;
char定义字符型变量时,只能定义单个字符,且必须用英文格式的单引号
如:char ch='c';
"\\"输出一个"\"
"\t"固定格式
用char定义字符串时,例:char sh[]="skals";
用char定义字符串时,写char sh[];是错误的,必须在定义的同时给字符串赋值。
如果不想在定义的同时赋值,就要在[]中加数字,如:char a[2];但是,这样在定义的时候就把可输入数据的最大长度确定了
char定义的字符串所占字节为字符串长度加一
用string定义字符串时,例:string sh="sjajsj2";
用string定义字符串必须引用头文件<string>,即必须在所写代码最前面写一行:#include <string>
string定义的字符串所占字节固定为28个,即使字符串长度超过28,也可以正常使用(在x86系统中)
而在x64系统中,string定义字符串所占字节固定为40个
bool定义数据为布尔型,只有false(0)和true(1)两种值,该数据类型固定占用一个字节
在具体赋值时,也可直接给与bool类型数据整数。当被给予的为非零数时,该数据为true(1);当被给予的数为零时,该数据为false(0)。(非零即真)
6/14
两个浮点数之间不能取模
只有整型可以进行取模运算
递减放前面,先减一后再使用;递减放后面,先使用再减一。递增相同
在比较运算符中,除<和>外,其他皆由两个符号组成
在c++中,只要不是0,皆为真
!置于表达式之前,使得布尔值变为原来相反的值
&&同真才为真,其他全为假
||同假才为假,其他全为真
if条件后面不能加分号
函数写完时,最后必须给一个返回值(如果函数前的标识为void,则不需要)
三目运算符中,可像这样写:
int a141 = 30;
int a142 = 20;
(a141 > a142 ? a141 : a142) = 100;
这样a141就会被赋值100,即在三目表达式中,返回值被赋值后又可以像以上一样再被赋值一次(在上述式子中,a141为返回值)
switch语句执行效率比if语句执行效率高
switch语句一般要搭配break语句使用
switch语句表达式类型只能是整型或字符型
6/16
值传递的时候,形参发生任何改变,都不会影响实参
指针定义语法:数据类型 *指针变量名
指针变量也有自己的地址
不能直接使得非指针变量为地址值,如:int a=&k;是错误的
指针的数据类型必须与所指数据的数据类型相同
6/17
0-255内存系统占用,无法访问
在程序中,要尽量避免出现野指针,出现后运行即报错
常量指针的指向可以修改,但是指针指向的值不可以修改
指针常量的指向不可以修该,但是指针指向的值可以修改
结构体定义语句末尾要加“;”
6/19
使用switch语句时,必须加上{},不然可能出现错误
因为{}限定了switch语句中命令的使用范围,如果不加{},switch语句中的命令就会在上一个大括号的范围内执行
如:
while (1)
{
showmenu();
cin >> select;
switch (select)
{
case 1://添加联系人
break;
case 2://删除联系人
break;
case 3://显示联系人
break;
case 4://修改联系人
break;
case 5://查找联系人
break;
case 6://清空联系人
break;
case 0://退出程序
cout << "退出成功" << endl;
return 0;
break;
}
}
在以上程序中,break语句不会打断循环
而:
while (1)
{
showmenu();
cin >> select;
switch (select)
case 0://退出程序
cout << "退出成功" << endl;
break;
}
在以上语句中,break语句会打断循环
另外,如果switch后不加{},则switch语句后只能跟一段分行,所以switch语句必须加上{}
6/20
c++内存四区:
代码区:存放函数体的二进制代码,由操作系统进行管理的
全局区:存放全局变量和静态变量以及常量
栈区:由编译器自动分配释放,存放函数的参数值,局部变量等
堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
在普通变量前面加static,属于静态变量
在全局区中的量:全局变量 静态变量(static关键字) 字符串常量 const修饰的全局变量(全局常量)
不在全局区中的量:局部变量 const修饰的局部变量(局部常量)
在函数中,严禁返回局部变量的地址
局部变量和形参数据会存放在栈区
运用new运算符时,new int(10)代表的是一个指向10变量的地址
而new int[10]代表的是1个含10个数据的数组的首地址
释放数组时应在delete后加上[]
6/21
引用时使用的数据类型应与原变量的数据类型相同
引用时必须初始化
引用一旦初始化后,就不可以更改
引用传递,形参也会修饰实参
严禁返回局部变量的引用
引用可以使得函数调用作为左值
引用的本质是一个指针常量
常量引用用来修饰形参,防止误操作
函数的声明和实现只能有一个有默认参数
如果某个位置参数有默认值,那么从这个位置往后,从左向右,必须都要有默认值
6/22
函数重载的满足条件:
1、同一个作用域下
2、函数名称相同
3、函数参数类型不同,或者个数不同,或者顺序不同
函数的返回值不可以作为函数重载的条件
当函数重载碰到默认参数,出现二义性,报错,尽量避免这种情况
成员属性设置为私有的优点:
1、将所有成员属性设置为私有,可以自己控制读写权限
2、对于写权限,我们可以检测数据的有效性
不要利用拷贝构造函数,初始化匿名对象,会出现重定义
当前 行执行结束后,系统会立即回收掉匿名对象
调用无参构造函数不能加括号,如果加了,编译器认为这是一个函数声明
6/23
c++中拷贝构造函数调用时机通常有三种情况:
1、使用一个已经创建完毕的对象来初始化一个新对象
2、值传递的方式给函数参数传值
3、以值方式返回局部对象
默认情况下,c++编译器至少给一个类添加3个函数
1、默认构造函数(无参,函数体为空)
2、默认析构函数(无参,函数体为空)
3、默认拷贝构造函数,对属性进行值拷贝
构造函数调用规则如下:
1.如果用户定义有参构造函数,c++不再提供默认无参构造,但是会提供默认拷贝构造
2.如果用户定义拷贝构造函数,c++不会再提供其他构造函数
浅拷贝:简单的赋值拷贝操作
深拷贝:在堆区重新申请空间,进行拷贝操作
如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题
当其他类对象作为本类成员,构造时候先构造类对象,再构造自身,析构顺序与构造相反
6/24
静态成员变量:(也有访问权限)
1、所有对象都共享同一份数据
2、编译阶段就分配内存
3、类内声明,类外初始化操作
静态成员函数可以访问静态成员变量,不可以访问非静态成员变量
空对象占用内存空间为:1
c++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存的位置
每个空对象也应该有一个独一无二的内存地址
只有非静态成员变量属于类的对象上,其他都不属于
this的作用:
1、当形参和成员变量同名时,可以用this指针来区分
2、返回对象本身
在成员函数后面加const,修饰的是this指向,让指针指向的值也不可以修改
6/25
常对象不可以调用普通成员函数,只能调用常函数
常函数:
1、成员函数后加const后我们称为这个函数为常函数
2、常函数内不可以修改成员属性
3、成员属性声明时加关键字mutable后,在常函数中依然可以修改
运算符重载概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型
对于内置的数据类型的表达式的运算符是不可能改变的
不要滥用运算符重载
只能利用全局函数重载左移运算符
重载后置递增时返回值,重载前置递增时返回引用
用int区分前置递增和后置递增,有int为后置递增,无int为前置递增
6/26
父类中所有非静态成员属性都会被子类继承下去
父类中私有成员属性,是被编译器给隐藏了,因此是访问不到,但是确实被继承下去了
继承中的构造和析构顺序:先构造父类,再构造子类,析构的顺序与构造的顺序相反
如果子类中出现和父类同名的成员函数,子类的同名成员会隐藏掉父类中所有同名成员函数
如果想访问到父类中被隐藏的同名成员函数,需要加作用域
子类对象可以直接访问到子类中同名成员
子类对象加作用域可以访问到父类同名成员
同名静态成员处理方式和非静态处理方式一样,只不过有两种访问的方式(通过对象和通过类名)
c++实际开发中不建议用多继承
当菱形继承,两个父类拥有相同数据,需要加以作用域区分
6/27
多态满足条件:1、有继承关系 2、子类重写父类中虚函数
多态使用:父类指针或引用指向子类对象
静态多态与动态多态区别:
静态多态的函数地址早绑定--编译阶段确定函数地址;动态多态的函数地址晚绑定--运行阶段确定函数地址
父类指针在析构时候,不会调用子类中析构函数,导致子类如果有堆区属性,出现内存泄漏
利用虚析构可以解决父类指针释放子类对象时不干净的问题
6/28
对象cout是ostream类的一个实例,并且在main函数被调用之前已经创建
以#define开头的代码行是一条预处理器指令,它表示代码文本中任意标记为指定名称的符号都被替换为一个常量
6/30
无法打开源文件,可能是找不到文件路径。把头文件的绝对地址加上,无法打开源文件的问题就解决了。
7/29
冒泡排序:两个相邻数进行比较,依据大小进行交换,不断循环最后将所有的数排序
如何优化冒泡排序:1、计算交换次数,如果一趟循环后交换次数为零,则直接结束排序
选择排序:每趟循环将最小(大)的数置于最前(后),多次循环后将所有的数排序
如何优化选择排序:1、在一趟循环后,同时将最小和最大的值选取出来,置于数组边缘
7/30
插入排序:选择一个数,将这个数与这个数之前的数进行比较,找到合适位置将其插入其中,多次循环之后将所有数进行排序
希尔排序:(针对直接插入排序算法进行改进后的算法)设定一个元素间隔,按间隔进行分组后比较,依照大小进行交换。利用循环多次缩小间隔,进行比较、交换,最终将所有数排序
希尔排序核心思想--化远为近 希尔排序优点:1、查找次数减少 2、移动元素次数减少
8/1
快速排序:先从数列中取出一个元素作为基准数,扫描数列,将比基准数小的元素全部放到它的左边,大的或等于基准数的元素全部放到它的右边,得到左右两个区间,再对左右区间重复上述步骤,直到各区间少于两个元素
快速排序优化:1、采用更合理的基准数,减少递归深度 2、结合插入排序,区间在10个元素之内采用插入排序,效率更高
归并排序:先将数据分组,在组内进行排序。再扩大单个组的数据容量,进行排序。多次重复之后将所有数据排序
面向对象三大特性:封装,继承和多态
8/2
起始迭代器:指向容器中第一个元素
结束迭代器:指向容器中最后一个元素的下一个位置
8/4
rfind从右往左查找,find从左往右查找
8/7
在类中,析构函数和构造函数必须公开