C++笔记.docx
- 文档编号:4042353
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:49
- 大小:1.85MB
C++笔记.docx
《C++笔记.docx》由会员分享,可在线阅读,更多相关《C++笔记.docx(49页珍藏版)》请在冰豆网上搜索。
C++笔记
C++笔记
基础C++风格_字符串_名称空间_引用
1c++程序文件
C++程序文件的后缀有xxx.cpp/xxx.C/xxx.cc/xxx.cxx
xxx.cpp//cpp是cplusplus即c++
2编译
g++//编译
g++-c//只编译
g++-cxxx.cpp//只编译xxx.cpp文件,会生成xxx.o
3编译文件
这是定义、连接分开做
g++xxx.o//编译xxx.o文件,会生成a.out
g++xxx.o-onewname//编译xxx.o文件,并重新命名为newname(注意-o是重新命名的意思,然后后面接的是newname,不是说新的名字为onewname)
下面的命令是定义、链接一起做
g++xxx.cpp//编译生成a.out文件
g++xxx.cpp-onewname//也可以给生成的文件重新命名
4
注释符号用//
C++中输入(cin)、输出(cout);其输入输出的头文件用的是iostream
C++凡是标准的头文件都不会是iostream.h的,标准的头文件都是iostream
C++与C相比较而言,多了namespace,为了避免名字的冲突、为了用起来方便。
多种库的全部的东西都放到了一个命名空间里,这个命名空间叫std
5关键字
using、namespace
特别说明一下,cin、cout这两个分别是用来输入和输出的对象,它们不是关键字。
特别说明一下,还记得在java当中字符串类型的类是String,而在C++当中string(要说明的是此处的开头s是小写的)是关键字、是一种类型。
6操作符
usingstd:
:
cout//A:
:
B表示A范围内的B,“:
:
”称为域操作符
我不用全部的,我使用标准库中的一部分。
cpp//该命令是c语言程序的预处理结果,编译器是不执行的。
7
这样是无法进行编译的,因为没有指明要使用哪一个命名空间。
8
这样才能进行编译,以往内这个文件中指明了要使用这个furong命名空间
9
有冲突还是需要区分开名字(在这里是为了把name给区分开),这就是命名空间的优越性。
在不产生冲突的时候,就不需要区分这个。
10
在不同范围内同名的时候,范围大小不同的时候,总是小范围的优先,局部有先。
11
到16行为止,我们就再没有定义name新变量,在main这个小范围内也没有定义变量,a处的name只能是去外面找,找到了12行、13行的czq、furong,当执行到第20行的时候,2处的要用name,它内部有,就不去外面找了,就用b处的name
16行:
cout<<”我喜欢”< 还是“芙蓉姐姐”? 所以会报错。 尽量去避免重名,如果避免不了的话也是局部优先 图a 图b 由上面的图a和图b,通过对比可以知道,cout< 这个变量的定义一定要在使用之前才可以。 图a: 21行定义的变量;22行使用的name变量。 图b: 19行使用;22行定义变量,图b显然是不对的做法。 总结: 在局部使用变量而没有说明具体使用哪一个命名空间的时候,这时候首先在局部里面找,但是也是在使用之前找变量的定义。 因为程序是从前往后执行的。 12 22行的: : name表示的意思是全局变量、或者是外面的,取得值就是14行的“王磊” cout<<: : name<<”也很帅”< 王磊 其实是这样的,C++里面,把没有放在名字空间里面的东西,统称为放在了匿名空间里面了 13 操作 C++风格字符串 C风格字符串 初始化 一样 一样 赋值 = strcpy(s2,……); 连接 += strcat(s2,……); 拼接新字符串 + 没有 字符串比较大小等 ==,! =,>,>=,<,<= strcmp(s2,……); 取得字符串的长度 s1.size()/s1.length() Strlen(s2); 查找 find(……); Strchr(s2,……);/(strstr(s2,……); 访问某个元素 s[i] s[i] 两种风格的字符串混合运算的时候,C风格字符串会自动转成C++风格字符串 自定义类型,在定义的时候用关键字,在使用的时候就不用重复关键字了。 还包括结构、枚举、联合统统如此. 凡是用“”包起来的字符串就是char数组即C字符串,这个都知道, strings1=”fff”;//”fff”这是个char数组是个C风格字符串,而这个赋值方式“=”是C++的,所以这个式子就足以说明C风格的字符串在和C++风格的字符串进行运算的时候,是自动向C++风格字符串转的。 14 在C里面是这样来写的,如下图 15 而在C++里面是这样来写的,如下图 如上图,在C++里面是把enum给去掉的,在C++里面自定义类型,定义的时候用关键字,在使用的时候不在使用关键字,枚举、结构、联合统统如此。 这样就省去了很多typedefine 16 枚举类型本身就是整数类型,把它上升为整数类型int类型是可以的,即枚举类型向int类型转换是可以的;但是反过来就不可以了。 即使枚举都是整数,它也这样严格检查,不同枚举之间不能互送,除非进行强制类型转换。 C里面会做类型提升,但是在C++里面在调用函数时不会再自动做类型提升了,类型是严格要求的,是什么类型就是什么类型。 只有一个例外,如果函数的形参是点点点……的,照样提升,按照c语言规则提升。 17 布尔类型,至少是一个字节,但最多不超过4个字节。 bool即布尔类型 18 bool规则还是和C一样: 把别的类型的数据当成真假的时候,还是非0为真,0为假 显示的时候并不现实任何内容,它会设置以后bool类型的输出都会用字母的类型来表示,true和false,而不再输出1或者0了。 引用---reference 1引用 在C里面,各种参数的传递包括赋值、形参、实参传给形参、返回值、用等号赋值统统是数据的复制,而引用呢,在C++里面它的意义就是给个变量,另取个名字。 类型T后面加上&表示这是个引用,即T& 引用只能用变量来初始化,也就是说“=”的右边只能是变量,不能是具体的数值。 如果非得用具体的数值,就要在其前面加上const (比如第9行,constdouble&c=234.56),其实就相当于java当中的final。 还可以引用一个临时值(比如第10行,constdouble&s=d+5),临时值就是“引用变量+具体值”,当时用可以,临时值当场不用过期就作废了。 2 引用变量必须都是同一种类型的,上面图所举得例子也是这样的,但是如果类型不一样的话就不能同为一个变量,比如int&n=d;就是通不过的,d这个变量在上面定义的是double类型的。 在17行,相当于又给d和e赋值了,把78.9分别赋值给了这两个变量。 3 如果要把两个不同类型的东西作为一个变量,用联合可以实现 4 引用的本身是用指针来实现的 一段C代码 constintn=100;//定义的n的值为100 int*p=(int*)&n;//把&n的地址传给了*p *p=123;//这时候,*p的值已经发生改变,成123 printf(“%d\n”,n);//又因为这是c程序每次都要去内存里拿所以打印输出n的值为123 如果是用CC编译器编译的话,相同情况下的代码,输出的结果是100;因为在 constintn=100;的时候,已经把值定义成了100,而此后C++程序也不会去程序里拿,所以还是100. 5 如果非得要在C++程序中每次都去内存中去拿的话,可以加关键字volatile #include intmain(){ constintn=100;//后面使用n的值的地方会直接用100代替 volatileconstintm=200;//m随时可能改变,每次从内存重新取 int*p=(int*)&n; *p=123; p=(int*)&m; *p=456; printf("%d,%d\n",n,m); return0; } volatile的意思是对于这个m变量的访问一定要每次都要进内存拿,当第二次进内存里面去拿的时候就已经成了456。 用C++编译,C++是做了一定的优化的 6 在C++里面放弃“强制类型转换”,但是因为考虑到与C兼容的问题,所以“强制类型转换”保留了,但是保留了并不代表C++就支持强制类型转换,其实还是不支持“强制类型转换”的 #include usingnamespacestd; //static_cast数值类型之间转换,有一方是void*的指针类型之前° //const_cast用于临时去掉const、volatile限制 //reinterpret_cast任意两种指针类型之间的转换,指针于数值类型之间的转换 //dynamic_cast父与子之间的转换 所以我们在写程序的时候尽量不要用强制类型转换了,用前三个里面的某一个来代替。 7 #include usingnamespacestd; intmain() { intn=45.67; } 在c里面这样写没有错误,但是在C++里面这样写是不被允许的,C++会认为这是强制类型转换得到的。 所以我们在写程序的时候尽量不要用强制类型转换了,用tatic_cast\const_cast\reinterpret里面的某一个来代替。 #include usingnamespacestd; intmain() { intn=static_cast } const_cast的作用就是: 把原来的去掉const的引用,相当于把常量改回了变量 8 #include usingnamespacestd; intmain(){//需要好好看下这个例子 intn=static_cast int*p=static_cast constintk=n; cout<<"k="< const_cast cout<<"k="< } 9如下面的一个例子,众多类型之间的互相转换,看对类型转换的把握是否熟练。 #include usingnamespacestd; intmain(){ intn=static_cast int*p=static_cast free(p); constintk=n; cout<<"k="< const_cast cout<<"k="< floatf=123.45; p=reinterpret_cast cout<<"*p="<<*p< n=int(12.34); cout<<"n="< n=int(); cout<<"n="< ;因为这里没有往函数里传值 intm(100); cout<<"m="< system("pause"); } 10下面是一个reinterpret_cast转换的一个例子,但是这样的转换用的并不是很多 #include usingnamespacestd; #include intmain(){ intn=static_cast int*p=static_cast free(p); constintk=n; cout<<"k="< const_cast cout<<"k="< floatf=123.45; p=reinterpret_cast cout<<"*p="<<*p< system("pause"); return0; } reinterpret_cast是指针类型之间的转换,这样用的并不多。 C语言头文件都对应着一个C++头文件 比如: #include 对应#include 每一个C语言头文件对应的C++头文件,都有特点,就是把“.h”去掉,在左侧加上“c”。 这样做一方面是符合了标准C++的要求,另一方面也说明这是来自C语言的 11.下面的这个例子还是类型的转换和函数的声明 #include usingnamespacestd; intmain(){ intn=static_cast int*p=static_cast free(p);//释放p的空间 constintk=n; cout<<"k="< const_cast cout<<"k="< floatf=123.45; p=reinterpret_cast cout<<"*p"<<*p< cout<<"n="< n=int(12.34); cout<<"n="< n=int(); cout<<"n="< intm(100); cout<<"m="< intx();//函数声明 int(y)=200;//尽量不用这种方式,容易跟强制类型转换混淆 cout<<"y="< system("pause"); //取地址符号的作用到底是在哪里? 平常来讲,都会用&来表示取地址符号的吧,但是*p又是用来表示干什么的啊? } intx();//在c中,返回类型是int类型,形参是任意多个任意类型 intx();//如果在C++中声明这么一个函数,表示返回类型int,形参无 12.用关键字来代替运算符 因为有些键盘上是不会包括所有的运算符的,为了使其输入在屏幕上,所以就出现了用关键字代替运算符的这种情况。 在C++当中,有些运算符是可以用关键字来代替的,对于有些键盘设备是没有这些按键的,所以是可能需要用关键字来代替的,对于我们来说需要注意的是定义的变量的名字不要和关键字重名 运算符 关键字 说明 ~ compl ^ xor ! not ! = not_eq | bitor 按位或 || or & bitand 按位与 && and &= and_eq |= or_eq ^= xor_eq 13.内存空间的申请 delete[]a;//告诉系统释放一片内存空间而不是一个变量的内存空间 deleteq;//释放一个变量的内存空间 空间,用new申请来的,用delete释放空间//这是C++的那一套 空间,用c这一套即(类型*)malloc(sizeof(类型))申请的,用free()来释放空间 #include usingnamespacestd; #include //new类型==>(类型*)malloc(sizeof(类型)) intmain(){ int*p=static_cast int*q=newint(); int*r=newint(888); intn=10; int*a=newint[n]; deleter; deleteq;//这块空间是new出来的,所以释放用delete delete[]a;//这块空间是new出来的,所以释放用delete free(p);//这块空间是malloc出来的,所以释放用free } 14. #include usingnamespacestd; #include #include intmain(){ string*p=static_cast int*q=newint;//不保证是0;int*q=newint();还不是这样写的,与java要多不一样就有多不一样,真是纠结死了 int*r=newint(888); intn=10; int*a=newint[n];//不保证清零;int*a=newint[n]{}这样写法是错误的,动态内存数组没有理由初始化,所以也没有这个语法 cout<<*q<<','<<*r<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 笔记