声明:我的c++笔记是建立在王桂林老师的视频和书籍的基础上的,我觉得这可能是中国最好的c++教学。我已经得到王老师的许可,推荐大家去看看,腾讯课堂网址https://ke.qq.com/course/115806这个笔记很大一部分是为了给自己看,当然希望大家不吝啬你们的想法思路,多多指教。
c++顾名思义 ++意味着c++是建立在c的基础上的,c++原来叫做 c with class 带类的c。按照惯例 "Hello Word"走起
c++
1 #include <iostream> 2 3 using namespace std; 4 5 int main(int argc, char *argv[]) 6 { 7 cout << "Hello World!" << endl; 8 return 0; 9 }
作为对比c
1 #include <stdio.h> 2 3 int main(int argc, char *argv[]) 4 { 5 printf("Hello World! "); 6 return 0; 7 }
看起来基本结构很相似,我所接触的程序语言无论是python matlab c 几乎都是从数据类型开始的,c++也不例外。毕竟编程语言就是处理数据的工具,最终还是要回归到人上。类型增强
真正的const
c语言中 const 修饰变量的时候 变量会变成一个常量 但是这是绝对的吗?c语言最大的特点就是自由,指针是C语言的灵魂,不多说上程序,不过我们首先得回顾一下 const 是怎么修饰变量的
1 #include <stdio.h> 2 3 int main(int argc, char *argv[]) 4 { 5 6 const int a=1;//const 修饰 a 等价于 int const a=1; 7 const int *b=0;//const 修饰*b 等价于 int const *b=1; 8 const int * const p=2;// const 修饰 *p 和p 指针和指针所指的变量都不能改变 9 return 0; 10 }
方法:去掉类型看const修饰什么
c语言中的const
1 #include <stdio.h> 2 int main(int argc, char *argv[]) 3 { 4 const int a=1; 5 int *p=&a; 6 *p=1024;//明修栈道 暗度陈仓 7 printf("%d ",a); 8 return 0; 9 }
可以看出c语言的const并不严格 const int *类型赋值给了int * 可以通过指针间接访问变量
c++中的const
1 #include <iostream> 2 3 using namespace std; 4 5 int main(int argc, char *argv[]) 6 { 7 const int a=100;//c++中const变量只能在定义时赋值 8 int *p=&a;//无法从const int * 转换为int * 9 cout <<a << endl; 10 return 0; 11 }
编译结果:
第一行是警告应该是中文编码问题,忽略它,主要看第二行,可以看出c++中const变量是真正的无法修改,类型检查比较严格,并且c++中const 变量只能在定义的时候赋值,c语言可以不复制,c++的严谨凸显无疑。
再来体会一下两者的差别
1 #include <stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 int main(int argc, char *argv[]) 5 { 6 int arr[2][3]; 7 char *p="hello c++"; 8 char *q=malloc(strlen(p)+1);//void * 转换为 char*不过推荐大家加上强转 9 strcpy(q,p); 10 printf("%s ",q); 11 free(q); 12 int **a=arr;//const int * 数组名是const的指针变量 赋值给指向指针的指针 13 return 0; 14 }
c++中
1 #include <iostream> 2 #include<string.h> 3 #include<stdlib.h> 4 using namespace std; 5 6 int main(int argc, char *argv[]) 7 { 8 int arr[2][3]; 9 char p[]="hello c++"; 10 char *q=malloc(strlen(p)+1);//void * 转换为 char*不过推荐大家加上强转 11 strcpy(q,p); 12 cout<<q<<endl; 13 free(q); 14 int **a=arr;//const int * 数组名是const的指针变量 赋值给指向指针的指针 15 return 0; 16 }
运行结果:
c++相对于c比较严谨 新增逻辑类型bool(c99也有这种类型,不过我是以标准c来比较的)
在c语言中0为假非零为真 c++新建了逻辑类型bool来表示 不多说上代码
1 #include <stdio.h> 2 3 int main(int argc, char *argv[]) 4 { 5 6 if(1) 7 { 8 printf("ture"); 9 } 10 else{ 11 printf("flase"); 12 } 13 return 0; 14 }
c++
1 #include <iostream> 2 using namespace std; 3 int main() { 4 bool flag = true; 5 if(flag) 6 printf("flag is true "); 7 else 8 printf("flag is flase "); 9 10 printf("sizeof(flag) = %d sizeof(bool) = %d ", sizeof(flag),sizeof(bool)); 11 12 flag = 2000; 13 printf("flag = %d ",flag); 14 return 0; 15 }
引用王老师的话“c 语言的逻辑真假用 0 和非 0 来表示。而 C++中有了具体的类型,但其本质,仍是 一个 char 类型的变量可被 0 和非 0 的数据赋值。”虽然能被赋值但是用printf输出后还是1比如bool类型被赋值但是printf后还是逻辑值1,觉得这个设定有点奇怪。
bool类型的本质(枚举类型)
#include <stdio.h> enum BOOL {FLASE,TRUE}; int main(int argc, char *argv[]) { enum BOOL flag=TRUE;//用枚举变量创建逻辑类型 if(flag) printf("true "); else printf("flase "); flag=100;//C语言中枚举不严格 return 0; }
可以看出bool类型本质上就是一种枚举,不过C语言中的枚举并不严格,那么首先枚举是什么?
百度百科:在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。[1] 是一个被命名的整型常数的集合,枚举在日常生活中很常见,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一个枚举。
王老师的枚举:c 语言中枚举本质就是整型,枚举变量可以用任意整型赋值。而 C++中枚举变量, 只能用被枚举出来的元素初始化。枚举的常被用来取代宏常量。
我所理解的枚举就是列出所有可能的数据集合,枚举变量必须在其中选择。由于枚举变量定义的时候集合里面的数据被赋值,所以副作用可以用来替代宏常量。
c++的枚举
1 #include <iostream> 2 3 using namespace std; 4 enum day 5 {SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY}; 6 int main(int argc, char *argv[]) 7 { 8 day today=SUNDAY; 9 today=100; 10 cout << today<< endl; 11 return 0; 12 }
运行结果:
c++是真正意义上的枚举,枚举变量不能被赋值任意整型。
总结:从整体上看c++比c严谨,c比c++自由。
扯蛋时间:我喜欢c++的bool,枚举,但是我也喜欢c的const,自由就是自律,相对的。
”