c++基础学习笔记——04-c++day01
在学习c++基础总结了笔记,并分享出来。有问题请及时联系博主:Alliswell_WP,转载请注明出处。
04-c++day01
目录:
一、C++概述
1、C++简介
2、可移植性和标准
二、C++初识
1、练习1:hello world
2、面向对象
3、面向对象三大特性
练习2:双冒号作用域运算符
练习3:namespace命名空间
练习4:using声明和using编译指令
三、C++对C扩展
1、C++对C语言增强
2、C++对C语言增强——const
3、const分配内存情况
4、尽量以const替换#define
四、引用
1、引用的基本语法以及注意事项
2、参数的传递方式
3、引用的注意事项
4、引用的本质
5、指针的引用
6、常量引用
五、总结
C++程序模板
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<iostream> 3 using namespace std; 4 5 void test()
{
} 6 7 int main() 8 { 9 test(); 10 11 system("pause"); 12 return EXIT_SUCCESS; 13 }
一、C++概述
1、C++简介
“c++”中的++来自于c语言中的递增运算符++,该运算符将变量加1。c++起初也叫”c with class”.通过名称表明,c++是对C的扩展,因此c++是c语言的超集,这意味着任何有效的c程序都是有效的c++程序。c++程序可以使用已有的c程序库。
库是编程模块的集合,可以在程序中调用它们。库对很多常见的编程问题提供了可靠的解决方法,因此可以节省程序员大量的时间和工作量。
c++语言在c语言的基础上添加了面向对象编程和泛型编程的支持。
c语言和c++语言的关系:
c++语言是在C语言的基础上,添加了面向对象、模板等现代程序设计语言的特性而发展起来的。两者无论是从语法规则上,还是从运算符的数量和使用上,都非常相似,所以我们常常将这两门语言统称为“C/C++”。
C语言和C++并不是对立的竞争关系:
1)C++是C语言的加强,是一种更好的C语言。
2)C++是以C语言为基础的,并且完全兼容C语言的特性。
c语言和C++语言的学习是可以相互促进。学好C语言,可以为我们将来进一步地学习C++语言打好基础,而C++语言的学习,也会促进我们对于C语言的理解,从而更好地运用C语言。
2、可移植性和标准
c++98——>(修订)c++98/c++2003——>c++11
二、C++初识
1、练习1:hello world
1 #define _CRT_SECURE_NO_WARNINGS
//#include<iostream>标准输入输出流 in输入 out 输出 2 using namespace std;//使用命名空间std 打开一个叫std房间 3 4 //函数入口地址 5 int main() 6 { 7 //cout标准的输出 8 // << 左移运算符 9 //endl 结束换行 10 cout << "hello world" << endl; 11 12 system("pause");//阻塞功能 13 return EXIT_SUCCESS;//返回正常退出 14 }
问题1:c++头文件为什么没有.h?
在c语言中头文件使用扩展名.h,将其作为一种通过名称标识文件类型的简单方式。但是c++得用法改变了,c++头文件没有扩展名。但是有些c语言的头文件被转换为c++的头文件,这些文件被重新命名,丢掉了扩展名.h(使之成为c++风格头文件),并在文件名称前面加上前缀c(表明来自c语言)。例如c++版本的math.h为cmath.
由于C使用不同的扩展名来表示不同文件类型,因此用一些特殊的扩展名(如hpp或hxx)表示c++的头文件也是可以的,ANSI/IOS标准委员会也认为是可以的,但是关键问题是用哪个比较好,最后一致同意不适用任何扩展名。
问题2:using namespace std 是什么?
namespace是指标识符的各种可见范围。命名空间用关键字namespace 来定义。命名空间是C++的一种机制,用来把单个标识符下的大量有逻辑联系的程序实体组合到一起。此标识符作为此组群的名字。
问题3:cout 、endl 是什么?
cout是c++中的标准输出流,endl是输出换行并刷新缓冲区。
2、面向对象
面向对象编程(Object-Oriented Programming)简称 OOP 技术,是开发计算机应用程序的一种新方法、新思想。过去的面向过程编程常常会导致所有的代码都包含在几个模块中,使程序难以阅读和维护。在做一些修改时常常牵一动百,使以后的开发和维护难以为继。而使用 OOP 技术,常常要使用许多代码模块,每个模块都只提供特定的功能,它们是彼此独立的,这样就增大了代码重用的几率,更加有利于软件的开发、维护和升级。
在面向对象中,算法与数据结构被看做是一个整体,称作对象,现实世界中任何类的对象都具有一定的属性和操作,也总能用数据结构与算法两者合一地来描述,所以可以用下面的等式来定义对象和程序:
对象 = 算法 + 数据结构
程序 = 对象 + 对象 + ……
3、面向对象三大特性
》封装
把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
类将成员变量和成员函数封装在类的内部,根据需要设置访问权限,通过成员函数管理内部状态。
》 继承
继承所表达的是类之间相关的关系,这种关系使得对象可以继承另外一类对象的特征和能力。
继承的作用:避免公用代码的重复开发,减少代码和数据冗余。
》多态
多态性可以简单地概括为“一个接口,多种方法”,字面意思为多种形态。程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。
练习2:双冒号作用域运算符
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<iostream> 3 using namespace std; 4 5 int atk = 200; 6 void test01() 7 { 8 int atk = 100; 9 10 cout << "攻击力为:" << atk << endl; 11 //双冒号 作用域运算符 ::全局作用域 12 cout << "全局攻击力为:" << ::atk << endl; 13 } 14 15 16 int main() 17 { 18 test01(); 19 20 system("pause"); 21 return EXIT_SUCCESS; 22 }
练习3:namespace命名空间
namespace的使用.cpp
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<iostream> 3 #include"game1.h" 4 #include"game2.h" 5 6 using namespace std; 7 8 //namespace命名空间主要用途 用来解决命名冲突的问题 9 void test01() 10 { 11 LOL::goAtk(); 12 KingGlory::goAtk(); 13 } 14 15 //1.命名空间下 可以放函数、变量、结构体、类 16 namespace A 17 { 18 void func(); 19 int m_A = 20; 20 struct Person 21 { 22 }; 23 class Animal{}; 24 namespace B 25 { 26 int m_A = 10; 27 } 28 } 29 //2.命名空间必须定义在全局作用域下 30 //3.命名空间可以嵌套命名空间 31 32 void test02() 33 { 34 cout << "作用域B下的m_A为:" << A::B::m_A << endl; 35 } 36 37 //4.命名空间是开放的,可以随时在原先的命名空间添加内容 38 namespace A //此A命名空间会和上面的命名空间A进行合并 39 { 40 int m_B = 1000; 41 } 42 43 void test03() 44 { 45 cout << "A::下的m_A为:" << A::m_A << "m_B为:" << A::m_B << endl; 46 } 47 48 //5.无名/匿名命名空间 49 namespace 50 { 51 int m_C = 0; 52 int m_D = 0; 53 } 54 //当写了无名命名空间,相当于写了static int m_C,static int m_D(即只能在当前文件中使用) 55 56 //6.命名空间可以起别名 57 namespace veryLongName 58 { 59 int m_A = 0; 60 } 61 void test04() 62 { 63 //起别名 64 namespace veryShortName = veryLongName; 65 cout << veryLongName::m_A << endl; 66 cout << veryShortName::m_A << endl; 67 } 68 69 70 int main() 71 { 72 test01(); 73 74 system("pause"); 75 return EXIT_SUCCESS; 76 }
game1.h
1 #include<iostream> 2 using namespace std; 3 4 namespace LOL 5 { 6 void goAtk(); 7 }
game1.c
1 #include "game1.h" 2 3 void LOL::goAtk() 4 { 5 cout << "LOL攻击实现" << endl; 6 }
game2.h
1 #include<iostream> 2 using namespace std; 3 4 namespace KingGlory 5 { 6 void goAtk(); 7 }
game2.c
1 #include"game2.h" 2 3 void KingGlory::goAtk() 4 { 5 cout << "王者农药攻击实现" << endl; 6 }
练习4:using声明和using编译指令
using声明和using编译指令.cpp
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<iostream> 3 using namespace std; 4 5 namespace KingGlory 6 { 7 int sunwukongId = 10; 8 } 9 10 void test01() 11 { 12 int sunwukongId = 20; 13 14 //using声明 15 //写了using声明后,下面这行代码说明以后看到的sunwukongId是用KingGlory下的 16 //但是 编译器又有就近原则 17 //二义性 18 //using KingGlory::sunwukongId; 19 20 cout << sunwukongId << endl; 21 } 22 23 //using编译指令 24 namespace LOL 25 { 26 int sunwukongId = 30; 27 } 28 29 30 void test02() 31 { 32 //int sunwukongId = 20; 33 //using编译指令 34 using namespace KingGlory;//打开王者荣耀房间 35 using namespace LOL;//打开LOL房间 36 //如果打开多个房间,也要避免二义性问题 37 cout << sunwukongId << endl; 38 } 39 40 int main() 41 { 42 test01(); 43 44 system("pause"); 45 return EXIT_SUCCESS; 46 }
三、C++对C扩展
1、C++对C语言增强
C语言代码——C++对C语言的增强C语言.c
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<string.h> 4 #include<stdlib.h> 5 6 //1.全局变量检测增强 7 int a; 8 int a = 10; 9 10 //2.函数检测增强 11 int getRectS(w, h) 12 { 13 } 14 void test02() 15 { 16 getRectS(10, 10, 10); 17 } 18 19 //3.类型转换检测增强 20 void test03() 21 { 22 char* p = malloc(sizeof(64));//malloc返回值是void* 23 } 24 25 //4.struct增强 26 struct Person 27 { 28 int m_Age; 29 //void plusAge();//C语言中struct不可以加函数 30 }; 31 void test04() 32 { 33 struct Person p1;//C语言使用时候必须加入struct关键字 34 } 35 36 //5.bool类型增强 C语言中没有bool类型 37 //bool flag; 38 39 //6.三目运算符增强 40 void test06() 41 { 42 int a = 10; 43 int b = 20; 44 45 printf("ret = %d\n", a > b ? a : b); 46 47 //a > b ? a : b = 100;//相当于20=100,C语言返回的是值 48 49 //C语言中想模仿C++写 50 *(a > b ? &a : &b) = 100; 51 printf("a = %d,b = %d\n", a, b); 52 } 53
//7.const增强
const int m_A = 10;//全局只读区,受到保护,不可以修改
void test07()
{
//m_A = 100;
const int m_B = 20;//伪常量
//m_B = 100;
int* p = (int*)&m_B;
*p = 200;
printf("*p = %d, m_B = %d\n", *p, m_B);
//int arr[m_B];不可以初始化数组
} 54 55 int main(){ 56 57 test02(); 58 59 system("pause"); 60 return EXIT_SUCCESS; 61 }
C++代码——C++对C语言的增强C++语言.cpp
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<iostream> 3 using namespace std; 4 5 //1.全局变量检测增强 6 //int a; 7 int a = 10; 8 9 //2.函数检测增强,参数类型增强,返回值检测增强,函数调用参数检测增强 10 int getRectS(int w, int h) 11 { 12 return w*h; 13 } 14 15 void test02() 16 { 17 getRectS(10, 10); 18 } 19 20 //3.类型转换检测增强 21 void test03() 22 { 23 char* p = (char*)malloc(sizeof(64));//malloc返回值是void* 24 } 25 26 //4.struct增强 27 struct Person 28 { 29 int m_Age; 30 void plusAge(){m_Age++;};//C++中struct可以加函数 31 }; 32 void test04() 33 { 34 Person p1;//C++使用时候可以不加struct关键字 35 p1.m_Age = 10; 36 p1.plusAge(); 37 cout << p1.m_Age << endl; 38 } 39 40 41 //5.bool类型增强 C++中有bool类型 42 bool flag = true;//只有真或假 true代表真(非0) false代表假(0) 43 void test05() 44 { 45 cout << sizeof(bool) << endl;//1个字节 46 47 flag = 100; 48 //bool类型 非0转为1,0就转为0 49 cout << flag << endl; 50 } 51 52 //6.三目运算符增强 53 void test06() 54 { 55 int a = 10; 56 int b = 20; 57 58 cout << "ret = " << (a > b ? a : b) << endl; 59 60 (a > b ? a : b) = 100;//b = 100,C++中返回的是变量 61 62 cout << "a = " << a << endl; 63 cout << "b = " << b << endl; 64 } 65
//7.const增强
const int m_A = 10;//全局只读区,受到保护,不可以修改
void test07()
{
//m_A = 100;
const int m_B = 20;//真正常量
//m_B = 100;
int* p = (int*)&m_B;
*p = 200;
cout << "*p = " << *p << endl;
cout << "m_B = " << m_B << endl;
int arr[m_B];//可以初始化数组
} 66 67 int main() 68 { 69 test02(); 70 71 system("pause"); 72 return EXIT_SUCCESS; 73 }
解释(7.const增强)
const int m_B = 20; C++写入符号表,不可更改;C编译器内部会临时开辟内存,可以通过指针更改。
2、C++对C语言增强——const
C语言中const默认外部链接,C++默认内部链接
C语言代码——test.c
1 const int a = 10;//C语言中默认是外部链接
C语言代码——C语言const默认是外部链接.c
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<string.h> 4 #include<stdlib.h> 5 6 7 int main(){ 8 9 extern const int a;//告诉编译器a在外部 10 printf("a = %d\n", a); 11 12 system("pause"); 13 return EXIT_SUCCESS; 14 }
C++代码——test.cpp
1 extern const int a = 10;//C++中默认是内部链接,extern提高作用域
C++代码——C++const默认是内部链接.cpp
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<iostream> 3 using namespace std; 4 5 6 int main() 7 { 8 extern const int a; 9 cout << "a = " << a << endl; 10 11 system("pause"); 12 return EXIT_SUCCESS; 13 }
3、const分配内存情况
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<iostream> 3 #include<string> 4 using namespace std; 5 6 //1.const分配内存 取地址会分配临时内存 7 //2.extern编译器也会给const变量分配内存 8 void test01() 9 { 10 const int m_A = 10; 11 int* p = (int*)&m_A;//会分配临时内存 12 } 13 14 //3.用普通变量初始化const的变量 15 void test02() 16 { 17 int a = 10; 18 const int b = a;//会分配内存 19 20 int* p = (int*)&b; 21 *p = 1000; 22 23 cout << "b = " << b << endl; 24 } 25 26 //4.自定义数据类型,加const也会分配内存 27 struct Person 28 { 29 string m_Name;//姓名 30 int m_Age; 31 } 32 void test03() 33 { 34 const Person p1; 35 //p1.m_Name = "aaa"; 36 37 Person* p = (Person*)&p1; 38 p->m_Name = "德玛西亚"; 39 (*p).m_Age = 18; 40 41 cout << "姓名:" << p1.m_Name << "年龄:" << p1.m_Age << endl; 42 } 43 44 45 int main() 46 { 47 test01(); 48 49 system("pause"); 50 return EXIT_SUCCESS; 51 }
4、尽量以const替换#define
在旧版本C中,如果想建立一个常量,必须使用预处理器”
#define MAX 1024;
我们定义的宏MAX从未被编译器看到过,因为在预处理阶段,所有的MAX已经被替换为了1024,于是MAX并没有将其加入到符号表中。但我们使用这个常量获得一个编译错误信息时,可能会带来一些困惑,因为这个信息可能会提到1024,但是并没有提到MAX.如果MAX被定义在一个不是你写的头文件中,你可能并不知道1024代表什么,也许解决这个问题要花费很长时间。
解决办法就是用一个常量替换上面的宏。
const int max= 1024;
const和#define区别总结:
1)const有类型,可进行编译器类型安全检查。#define无类型,不可进行类型检查.
2)const有作用域,而#define不重视作用域,默认定义处到文件结尾.如果定义在指定作用域下有效的常量,那么#define就不能用。
四、引用
1、引用的基本语法以及注意事项
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<iostream> 3 using namespace std; 4 5 //1.引用基本语法 Type &别名 = 原名 6 void test01() 7 { 8 int a = 10; 9 int &b = a; 10 11 b = 20; 12 13 cout << "a = " << a << endl; 14 cout << "b = " << b << endl; 15 } 16 17 //2.引用必须初始化 18 void test02() 19 { 20 //int &a;//必须初始化 21 int a = 10; 22 int &b = a;//引用初始化后不可以修改了 23 int c = 20; 24 25 b = c;//赋值!!! 26 } 27 28 //3.对数组建立引用 29 void test03() 30 { 31 int arr[10]; 32 for(int i = 0; i < 10; i++) 33 { 34 arr[i] = i; 35 } 36 37 //给数组起别名 38 int(&pArr)[10] = arr; 39 for(int i = 0; i < 10; i++) 40 { 41 cout << pArr[i] << " "; 42 } 43 cout << endl; 44 45 //第二种方式 起别名 46 47 typedef int(ARRAYREF)[10];//一个具有10个元素的int类型的数组 48 ARRAYREF &pArr2 = arr; 49 for(int i = 0; i < 10; i++) 50 { 51 cout << pArr2[i] << " "; 52 } 53 } 54 55 int main() 56 { 57 test01(); 58 59 system("pause"); 60 return EXIT_SUCCESS; 61 }
2、参数的传递方式
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<iostream> 3 using namespace std; 4
//值传递 5 void mySwap(int a, int b) 6 { 7 int temp = a; 8 a = b; 9 b = temp; 10 11 cout << "mySwap:a = " << a << endl; 12 cout << "mySwap:b = " << b << endl; 13 } 14 15 void test01() 16 { 17 int a = 10; 18 int b = 20; 19 mySwap(a, b);//值传递 20 21 cout << "a = " << a << endl; 22 cout << "b = " << b << endl; 23 } 24 25 //地址传递 26 void mySwap2(int* a, int* b) 27 { 28 int temp = *a; 29 *a = *b; 30 *b = temp; 31 } 32 void test02() 33 { 34 int a = 10; 35 int b = 20; 36 mySwap2(&a, &b);//地址传递 37 38 cout << "a = " << a << endl; 39 cout << "b = " << b << endl; 40 } 41 42 //引用传递,类似传地址 43 void mySwap3(int &a, int &b)//&a = a, &b = b 44 { 45 int temp = a; 46 a = b; 47 b = temp; 48 } 49 void test03() 50 { 51 int a = 10; 52 int b = 20; 53 mySwap3(a, b); 54 55 cout << "a = " << a << endl; 56 cout << "b = " << b << endl; 57 } 58 59 int main() 60 { 61 test01(); 62 63 system("pause"); 64 return EXIT_SUCCESS; 65 }
3、引用的注意事项
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<iostream> 3 using namespace std; 4 5 //引用的注意事项 6 //1.引用必须引一块合法的内存空间 7 //2.不要返回局部变量的引用 8 int& doWork() 9 { 10 int a = 10; 11 return a; 12 } 13 void test01() 14 { 15 //int &a = 10;//引用必须引一块合法的内存空间 16 17 int &ret = doWork(); 18 cout << "ret = " << ret << endl;//第一次10是编译器做了优化 19 cout << "ret = " << ret << endl; 20 cout << "ret = " << ret << endl; 21 cout << "ret = " << ret << endl; 22 cout << "ret = " << ret << endl; 23 } 24 25 int& doWork2() 26 { 27 static int a = 10; 28 return a; 29 } 30 void test02() 31 { 32 int &ret = doWork2(); 33 34 //3、如果函数的返回值是引用,那么这个函数可以作为左值 35 doWork2() = 1000;//相当于写了a = 1000 36 } 37 38 39 int main() 40 { 41 test01(); 42 43 system("pause"); 44 return EXIT_SUCCESS; 45 }
4、引用的本质
引用的本质在c++内部实现是一个指针常量。
1 Type& ref = val; // Type* const ref = &val;
c++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同,只是这个过程是编译器内部实现,用户不可见。
1 //发现是引用,转换为 int* const ref = &a; 2 void testFunc(int& ref){ 3 ref = 100; // ref是引用,转换为*ref = 100 4 } 5 int main(){ 6 int a = 10; 7 int& aRef = a; //自动转换为 int* const aRef = &a;这也能说明引用为什么必须初始化 8 aRef = 20; //内部发现aRef是引用,自动帮我们转换为: *aRef = 20; 9 cout << "a:" << a << endl; 10 cout << "aRef:" << aRef << endl; 11 testFunc(a); 12 return EXIT_SUCCESS; 13 }
5、指针的引用
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<iostream> 3 using namespace std; 4 5 struct Person 6 { 7 int m_Age; 8 }; 9 10 void allocateMemory(Person** p)//**p 具体的Person对象 *p对象的指针 p指针的指针 11 { 12 *p = (Person*)malloc(sizeof(Person)); 13 14 (*p)->m_Age = 100; 15 } 16 17 void test01() 18 { 19 Person* p = NULL; 20 allocateMemory(&p); 21 cout << "p的年龄:" << p->m_Age << endl; 22 } 23 24 //利用指针引用开辟空间 25 void allocateMemoryByRef(Person* &p) 26 { 27 p = (Person*)malloc(sizeof(Person)); 28 p->m_Age = 1000; 29 } 30 31 void test02() 32 { 33 Person* p = NULL; 34 allocateMemoryByRef(p); 35 cout << "p的年龄:" << p->m_Age << endl; 36 } 37 38 39 int main() 40 { 41 test01(); 42 43 system("pause"); 44 return EXIT_SUCCESS; 45 }
6、常量引用
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<iostream> 3 using namespace std; 4 5 6 void test01() 7 { 8 //int &ref = 10;//引用了不合法的内存,不可以 9 const int &ref = 10;//加入const后,编译器内部处理方式为:int tmp = 10; const int &ref = tmp; 10 11 //ref = 20;//不可以直接改 12 13 int* p = (int*)&ref; 14 *p = 1000; 15 16 cout << "ref = " << ref << endl; 17 18 } 19 20 //常量引用使用场景,用来修饰形参 21 void showValue(const int &val) 22 { 23 //val += 1000;//如果只是想显示内容,而不修改内容,那么就用const修饰这个形参 24 cout << "val = " << val << endl; 25 } 26 void test02() 27 { 28 int a = 10; 29 showValue(a); 30 } 31 32 33 int main() 34 { 35 test01(); 36 37 system("pause"); 38 return EXIT_SUCCESS; 39 }
[const引用使用场景]
常量引用主要用在函数的形参,尤其是类的拷贝/复制构造函数。
将函数的形参定义为常量引用的好处:
>引用不产生新的变量,减少形参与实参传递时的开销。
>由于引用可能导致实参随形参改变而改变,将其定义为常量引用可以消除这种副作用。
如果希望实参随着形参的改变而改变,那么使用一般的引用,如果不希望实参随着形参改变,那么使用常引用。
五、总结
1 #include <iostream>
1.1 using namespace std;
1.2 cout << “hello ..” << endl;
1.3 system(“pause”)
1.4 retrun 0
2 ::双冒号作用域运算符
2.1 全局作用域 直接加::
3 namespace 命名空间
3.1 用途 解决名称冲突问题
3.2 必须在全局作用域下声明
3.3 命名空间下可以放入 函数、变量、结构体、类…
3.4 命名空间可以嵌套命名空间
3.5 命名空间是开放的,可以随时加入新的成员
3.6 匿名命名空间 static
3.7 可以起别名
4 using声明和using编译指令
4.1 using LOL:: sunwukongID;
4.2 如果局部范围内还有 sunwukongID,会出现二义性问题,要注意避免
4.3 编译指令
4.4 using namespace LOL
4.5 如果局部范围内还有 sunwukongID ,使用局部的ID
4.6 如果打开多个房间,那么也要注意二义性问题
5 C++对C语言增强
5.1 全局变量检测增强
5.2 函数检测增强
5.2.1 参数类型检测
5.2.2 返回值检测
5.2.3 传参个数检测
5.3 类型转换检测增强
5.3.1 malloc返回void* ,C中可以不用强转,C++必须强转
5.4 struct增强
5.4.1 C中不许有函数 C++可以
5.4.2 使用C必须加关键字 struct ,C++可以不加
5.5 bool数据类型增强
5.5.1 C没有 C++有
5.5.2 true 真 false假
5.5.3 sizeof 1
5.6 三目运算符增强
5.6.1 C中返回的是值
5.6.2 C++中返回的是变量
5.7 const增强
5.7.1 C语言中const是伪常量,可以通过指针修改
5.7.2 C++中const会放入到符号表中
5.7.3 C语言中const默认是外部链接,C++中const默认是内部链接
5.7.4 const分配内存情况
5.7.4.1 对变量取地址,会分配临时内存
5.7.4.2 extern关键字下的const会分配内存
5.7.4.3 用普通变量初始化const变量
5.7.4.4 自定义数据类型会分配内存
5.7.5 尽量用const代替define
5.7.5.1 define宏没有作用域概念
5.7.5.2 define宏常量没有类型
6 引用基本语法
6.1.1 用途起别名
6.1.2 Type &别名 = 原名
6.1.3 引用必须初始化
6.1.4 一旦初始化后 不能修改
6.1.5 对数组建立引用
6.2 参数3种传递方式
6.2.1 值传递
6.2.2 地址传递
6.2.3 引用传递
6.3 注意事项,不要返回局部变量的引用
6.4 如果函数返回值是引用,那么函数的调用可以作为左值
6.5 引用的本质 就是一个指针常量
7 指针的引用
7.1 用一级指针引用 可以代替二级指针
8 常量引用
8.1 使用场景 修饰形参为只读
8.2 const int &a = 10;会分配内存
在学习c++基础总结了笔记,并分享出来。有问题请及时联系博主:Alliswell_WP,转载请注明出处。
posted on 2020-06-10 17:37 Alliswell_WP 阅读(208) 评论(0) 编辑 收藏 举报