c++学习笔记

一个新的数据类型 布尔
Boolean date types:bool
can store only one of two values :true(1) or false(0) occupy 1 byte memory

c语言和c++关于强制类型转换的区别
C type cast :using type cast operator (type) int a=1; float b= (float)a/2;
C++ type cast :using static_cast static_cast(expression) int a=1; float b=static_cast(a)/2;
模板:static_cast<像转换成的类型>(哪一个数据)

namespace
如果用到多个公司发行的库,而且他们都在全局声明,这样就会造成空间污染(namespace pollution),其中一个方法是给变量增加前后缀,
但是会很麻烦,而namespace就很好的解决了。
namespace是把全局空间分割成小空间,每一个小的空间叫做作用域,互不相同的命名空间内可以存在名字相同的变量
三种使用namespace的方法

但是using引用以后怎么再次用另一个的问题还没有明白??????

Manipulators(流操纵符)--# include"iomanip" 例如endl setw setfill fixed setprecision
manipulators are used to modify input and ouput data streams 流操纵符用来修饰输入和输出的数据流
endl 在屏幕上开始新的一行

setw 操控数据的宽度 (小数点也算一位)--------setw很特殊,几乎只有这个流操纵符是单一控制,即每次使用都要用重新写一遍setw,如果宽度小于实际,则无影响,大于的话就在前面多出空格

setfill 把空白的占位符更换成其他的字符 (把空格换成*&%$之类的)

fixed 它表示浮点输出应该以固定点或小数点表示法显示 但更多时候是配合setprecision使用 c++默认保留6位有效数字

setprecision 更改保留有效数字的位数---如果单独使用这个是控制有效位数,和fixed配合就是控制保留小数点后几位数字

whitespace characters(空白字符) ---Tab Enter Space bar

noskipws----No skip white space不跳过空白字符

一般的cin不能接受空白字符 而且如果用字符数组的话有溢出的风险
所以我们引入了getline()


cin.getline(输入的变量名字,多少个字符,以什么作为结束(默认是回车))
而getline也有一点儿问题,它和c语言中getchar差不多,上一步输入的回车键会被吸收,导致getline的输入产生问题
可以加一个cin.get(随便定义一个变量a)

忽略函数 如果想忽略很多的东西就不能用cin.get()了 用ignore(忽略的个数,结束的标志)

string是c++新的数据类型,存在于c++的头文件中# include"string"
三个头文件的区别
1.c语言中字符串 # include "string.h"
2.在c++当中操作c # include "cstring"
3.在c++中操作c++ # include "string"

赋值和初始化的知识
如果字符串不给赋值的话,里面的内容是空,没有\0是个纯粹的空行

str.assign的两个用法
1.str.assign(个数,字符)-------把这个字符复制几次赋给这个字符串
2.str1.assign(str2,1,3)-------从str2的第1个字符开始数三个赋给str1(注意!!!是从第0个开始数)

字符串的交换

字符串的连接 可以直接相加,也可以用append函数
str1.append("aaaaaaa")-----在str1后面添加aaaaaaa
str2.append(6,'a')--------在str1后面添加6个a
str3.append(str4,7,11)-------从str4的第7位开始截取11个字符加在str3的后面(从0开始计数)

字符串的索引和求字串 可以用c语言中的[] 也可以用at
用下标的方式在某些编译器中不进行预计检查
但是用at不管用哪一种编译器都会检查 所以用at更加安全 不会存在超出程序崩溃的危险

求子串就更简单啦 -----------str.substr

字符串的替换------谁调用就替换谁----str.replace

str1.replace(str1的起始字符位置,想替换的个数,str2,str2起始字符位置,像替换的个数)
如果想全部的str2都想要,那么后面的两个参数可以省略

字符串的删除-----str.erase(从第几个位置开始删除,想删除多少(可以省略,省略的话就是后面的全都删除))如果两个参数都没有全部清空
str.empty是判断!!!!!!不会清除只是判断返回的是真假

字符串的插入----str1.insert(插入的位置 默认插在前面,str2,位置,个数)后两个参数可以省略

字符串的查找 -----str.find() 返回的是int类型(位置)找不到返回-1
如果有多个,只找到第一次出现的位置
如果想反向查找-----str.rfind()返回的还是正向的顺序值
下面的两个只要存在其中的一个字符即可
0123456789 即随便存在一个数字即可返回 **********************************************

判断字符串是否相等 直接用>< ==

字符串的输入和输出
只要使用了cin就不能有空白符 所以要用getline
cin.getline()-------c风格字符串 charb[20] cin.getline(b,20,'\n') 先定义一个数组 c风格
getline()-----------c++风格字符串 getline(cin,a,'\n')--------可以把带空格的输进去

c风格字符串与c++风格字符串的转化
c语言转换成c++更简单

c++转换成c

或者

字符串数组c++

默认形参值
如果想要默认形参之的话,一定要在函数第一次出现的时候操作,比如说函数的声明在最上面,那么就从函数的声明操作
操作很简单f(int num,int mun2=1)-------------不用输入mun2 默认值就是1--如果输入就把默认值覆
注意如果有默认值的话,右面的形参一定也是默认值!!!!!,而左面的无所谓**********

内联函数--------解决函数调用负担的问题
在函数前面加一个inline
inline int f(int a,int b)
什么时候用:当函数里面的操作十分简单的时候!!!!!!!!!!!!

值传递------实参的拷贝 意味着不同的变量 不同的存储空间 在函数里面无法改变实参的值
传引用------必须在定义的时候就要赋值 这个比指针简单很多 而且值传递的效率高很多,尤其是内容多的情况下

容易混淆的地方:
如果&出现在数据类型的后面--------引用
其他的地方----------------取地址符

结构体和c++字符串的函数传递
结构体默认是值传递 值传递就是拷贝 绝对互不影响
以下是引用传递 改了以后会互相影响

还有一个挺好玩的 就是用引用传递但是不想意外从函数中修改结构体的内容 只是想要输出
那么我们可以加一个关键字const void f(const struct student s) ------const是只读不写

c++风格字符串的传递-----和结构体差不多

函数的重载

重载的(名字相同的)所有函数要么有不同数量的参数,要么有不同类型的参数 与返回值无关
如果并不是完美匹配,系统就傻了,要用强制类型转换 如果重载函数只有一个 那么数据会进行自动的强制类型转换

随机值函数 # include"stdlib" rand()
系统产生随机数是通过一个种子来决定的 如果种子不改变 那么产生的随机数序列就不会变
比如说第一次循环 333333333 4444444 5555555 6666666
如果种子不变第二次还会是333333333 4444444 5555555 6666666

改变种子 srand(time(0)) 用time函数要加头文件# include"time" time(0)-----取当前时间 从1970年1月1日到现在过去了多少秒。。。。。

如果想看现在的时间 ctime-----在用过time的基础上用


构造函数
1.构造的函数与类的名字 相同
2.当这个类构造了一个对象的时候由系统 自动 调用这个函数
3.作用:用来给这个对象的 私有 成员(private date)供初始值
4.不需要返回值,都不用写void 因为是系统调用
5.构造函数要写在public里面

默认构造函数
1.在主函数里调用不要括号
2.也可以重载构造函数

初始化列表--------更灵活,常量变量都可以用

静态类数据成员
1不属于某个具体的对象object,而是属于这一个类class
2这个静态数据成员只存在一个,在所有的对象中是共享的,如果从其中一个对象中修改这个值,在其他的对象中也会被修改
3怎么定义 在前面加 static 如果加上static的话,编译会有问题,就要重新定义,因为这个变量没有被开辟一个空间

4不能在函数中对其初始化,但是可以在函数中访问它

读值函数和设值函数----------顾名思义 在外界无法直接访问private的值,借助一个中间商赚差价

1.读值函数,一般定义为get_数据名称----约定俗成
2.设值函数,一般定义为set_数据名称----约定俗成
注意:静态数据虽然定义在class外面,但是其在private中声明了,首先看声明,所以也受private的限制,同样不能直接访问

内联函数inline-----之前学过,就是为了简化函数的运行时间,因为有一些函数里面的语句特别简单 就比如说上面的读值函数只有一个返回 这个太简单了
1.第一种内联函数:只需要在正常函数前面加一个inline就行
2.第二种内联函数,专门针对class的!!!上回书说到,读值函数和设值函数语句很短,而短也要定义,这样就很繁琐,因为在class里面声明了一遍,在外面还要再定义一遍
而且定义和生命都要加上inline 现在有一种更简单的写法,看起来更加的清爽,直接在class中定义即可,这样既定义有相当于声明了,而且不用加inline,系统自动定义为inline函数

分离类的接口和实现
1.接口------public部分---此部分是给别人看的,所以要有详细的注释
2.实现------private部分和函数的定义-----别人不需要看,只需要通过接口部分就可以使用你的这个类

分离操作-------------将接口和实现放在两个不同的文件中 工具------设置------专家设置-----这样就有一个 "解决方案管理器"
1.首先把接口部分放到头文件里---接口部分就是class,因为无法将public和private分的太清楚,这样就行
右键头文件-----添加-----新建项-----头文件
2.然后把实现放在源文件当中,右键源文件-----添加----新建项----源文件
3.把所有的头文件补全
注意:这样弄就不弄采取第二种内联函数方法,只能是声明一遍定义一遍

关于重复include的解决方法

指针和动态内存分配

int i;
const int* p=&i;(i不可变-------这可能有些怪异,记住吧)
int const* p=&i;还是i不可变
int* const p=&i;-----i的地址不能变
const int* const p=&i;
要想看const修饰谁 去掉int就行***************

类的指针也是一样的,如果想调用类里面的成员用().或者是->就行

动态内存分配
malloc函数------#include"cstdlib"
内存分配运算符new
p=new 数据类型[元素的个数];---------返回值是第一个数组元素的地址
释放--------delete[] p;

用new分配一个类数组
1.只要用new构造类数组,这个类必须要有默认构造函数,否则会出错
2.如果只想分配一个变量则可以用小括号 int* p=new int(100)------这个变量的值是100
二维数组

运算符重载
定义一个运算符可以用运算符函数
函数名是------返回值 operator运算符号(参数)


运算符重载的规则

  1. . .* :: ?: sizeof 这5个不能重载 其他的都可以
    2.不能创造新的运算符 只能在原有的基础上重载
    3.重载之后的运算符必须和原有的运算符有一样数目的操作数
    4.重载前后的优先级必须相同
    5.只能重载自定义的类中的函数

this-----------类的指针 永远指向主调类

析构函数------构造函数的反---------主函数结束以后调用
1.函数名与类名相同 多了一个波浪线
2。只能有一个析构函数

继承----inheritance

posted @ 2020-02-24 09:41  panghushalu  阅读(175)  评论(0编辑  收藏  举报