- 占用内存是1个字节
- 打印出来的值是: 0或者1 非零值表示成立
- 通常用的是false和true做初始化
- 用途:
- 做开关
- 做标记–>查找类的操作
- 做函数返回值
#include引用类型using namespace std; int main() { bool bnum = 5; cout << bnum << endl; //一般是会用都用关键字初始化 bnum = false; //0 cout << bnum << endl; bnum = true; //1 cout << bnum << endl; return 0; }
可以把引用类型理解为一个起别名的用法
- 左值引用
- 当做函数参数: 直接修改实参,防止拷贝本产生
- 当做返回值: 增加左值使用
- const属性限定问题
#includeusing namespace std; void num(int& a)//做函数参数,直接修改实参 { a = 100; } int _num = 1; int& num_1() //当做返回值: 增加左值使用 { return _num; } int num_2() { return _num; } void printfNum(const int& num)//const属性限定 { //num++; //常引用不能做++ cout << num << endl; } int main() { int a=1; int& a1=a; cout << a1 << endl; int b = 1; num(b); cout << b << endl; num_1() = 101;//返回一个变量,可以充当运算符左值 //num_2() = 1003; 错误,返回是一个值,不是一个变量,不能充当运算符左值 cout << _num << endl; printfNum(102); return 0; }
- 右值引用
- 给右值起别名
- 当做函数参数: 函数只能传入右值
- 想要传入左值,使用move函数移动
#includeC++结构体类型using namespace std; void printfNum(int&& num) //只能传入右值 { num++; //提供修改接口 cout << num << endl; } int main() { //右值引用 && --->提供修改接口 int&& num = 1; num = 100; cout << num << endl; printfNum(100); //将左值变成右值 int num_1 = 101; int&& num_2 = move(num_1); //移动函数:把左值变成右值 printfNum(move(num_2)); printfNum(move(num_1)); return 0; }
- 类型名不再需要struct关键字了
- C++结构体可以给成员直接赋初始值
- C++结构体可以包含函数
- 在结构体中声明,在结构体外实现,也可以直接在结构体中实现
- 结构体中函数访问数据,是可以直接访问
- 学会调用,和访问数据成员时的方式一样
- 对象(结构体变量).成员
- 对象指针->成员
- (*对象指针).成员
- 其实C++结构体的处理就是按照类的方式处理(后续会讲到)
- 用了构造函数时候C++结构体和C语言结构体处理方案是完全不同的
#includeC++枚举类型using namespace std; //描述的是事物特征和行为 struct MM { char name[20] = "MM"; int age = 111; int num = 1001; void initData(const char* str, int age, int num); //在结构体声明 void printData() { cout << name << "t" << age << "t" << num << endl; } }; //在外面实现,必须要加结构体名限定 MM:: void MM::initData(const char* str, int age, int num) { strcpy_s(name, 20, str); //同名问题,对其作用域限定 MM::age = age; MM::num = num; } int main() { //类型可以不需要struct MM mm; mm.printData(); cout << mm.name << "t" << mm.age << "t" << mm.num << endl << endl; MM mm2 = { "mm2",18,1030 }; mm2.printData(); cout << mm2.name << "t" << mm2.age << "t" << mm2.num << endl << endl; mm2.initData("小芳", 18, 1004); mm2.printData(); return 0; }
- C++的枚举类型不能当做一个简单的int类型
- 访问必须要用枚举类型名限定
#includeC++string类型using namespace std; enum State {Open,Close}; enum class Color { Red, Blue }; void print(int state) { cout << state << endl; } void printEnum(Color color) { //cout << color << endl; 不能直接打印 } void testEnum() { print(1); print(Open); //print(Color::Red); //访问必须要用枚举类型名限定 printEnum(Color::Red); } int main() { testEnum() return 0; }
C++string本身是一个类,所以大家本节课只要学会使用即可,不需要问问什么
- 头文件: #include
- 注意点和cstring区别,cstring是C语言头文件
- 没有用using namespace std ; string类型需要改为std::string
- 掌握string常用方式
- 创建方式
- 基本操作(比较,连接)
- 转C语言char*
微软帮助文档:basic_string 类 | Microsoft Docs
int a = (int)1.3; //C语言强制类型转换 int b = int(1.34); //C++强制类型转换 #includeC++自动推断类型#include using namespace std; int main() { //std::string str; //No.1创建 //1 string str1; str1 = "ILoveyou"; cout << str1 << endl; //2 string str2 = "helloWord"; cout << str2 << endl; //3 string str3(str2); cout << str3 << endl; //4 string str4 = str2; cout << str4 << endl; //No.2 基本操作 cout << (str3 == str4) << endl; cout << (str3 > str4) << endl; string password; cin >> password; cout << password; //原理是:运算符重载 后面会讲 //C++中尽量用string 不要用char* //比较直接比较即可 //> < != == if (password == string("12345")) { cout << endl << "密码正确" << endl; } //连接直接用加法 //字符串a+字符串b string name = "张三"; string info = name + "很帅"; cout << info << endl; //上述复杂的用法 cout << info.compare(name) << endl; //和strcmp 返回值一样 cout << info.append(name) << endl; //和strcat 返回值一样 cout << info.length() << endl; //当前长度 cout << info.size() << endl; //下标的方式访问 for (int i = 0; i < info.length(); i++) { cout << info[i]; } cout << endl; for (int i = 0; i < info.length(); i++) { cout << info.at(i); } cout << endl; cout << info.capacity() << endl; //容量 //和C语言string.h有区别的 char* // 不能用%s的方式打印 //printf("%sn", info); 错 // 图形库中传char* 函数 都不能直接用string类型 //提供两个函数: c_str() data(); printf("%sn", info.c_str()); printf("%sn", info.data()); return 0; }
- auto类型
- auto 类型自动推断: 一定要有赋值 所以不能单独定义变量
- auto a; 没有赋值 推断不出来
- decltype类型
#includeC++动态内存申请using namespace std; struct MM { int age; }; MM g_MM = { 12 }; MM* createMM() { MM* p=&g_MM; return p; } int Max(int a, int b) { return a > b ? a : b; } void print(int(*Max)(int, int), int a, int b) { cout << Max(a, b) << endl; } void printData(int(*)(int, int), int, int) { cout << "另一个函数" << endl; } int main() { auto a = 1; //int a = 134; auto pMM = createMM(); cout << pMM->age << endl; auto pFunc = print; //void (*)(int(*)(int, int), int , int ) pFunc(Max, 1, 3); pFunc = printData; pFunc(Max, 1, 3); int* p = nullptr; //新的空 等效C语言NULL //decltype 不需要赋值 decltype(123) num = 123; //decltype(123) 表示一个int类型 //函数指针必须取地址 decltype(&print) ppFunc; ppFunc = printData; //推断一个int decltype(num) Num = num; decltype(&num) pNum = # //当你们用的时候,不知道类型,推断定义变量去赋值 return 0; }
C++申请的内存是自由存储区的,C语言的堆区内存,所以C++类的对象内存不能用malloc申请
- new申请内存
- 申请单个变量内存
- 申请一段内存
- 申请内存可以手动初始化
- 申请内存后可以再分配
- delete释放内存
- 释放单个变量内存:delete 指针名;
- 释放一段变量内存: delete[] 指针名;
#includeusing namespace std; struct MM { char name[20]; int age; int num; }; void testOne() { int* pInt = new int; *pInt = 123; cout << pInt[0] << endl; delete pInt; pInt = nullptr; char* pc = new char; delete pc; int* pNum = new int(1234); //申请并且初始化 cout << pNum[0] << endl; delete pNum; MM* pMM = new MM({ "name",12,1101 }); cout << pMM->name << "t" << pMM->age << "t" << pMM->num << endl; } void testTwo() { //一段内存的申请 int size = 4; int* pArray = new int[size]; //int pArray[4]; MM* pMM = new MM[4]; //MM pMM[4]; delete[] pArray; delete[] pMM; pArray = nullptr; pMM = nullptr; int* pNum = new int[4]{ 1, 2, 3, 4 }; for (int i = 0; i < 4; i++) { cout << pNum[i] << "t"; } cout << endl; delete[] pNum; pNum = nullptr; } void testThree() { char* pMem = new char[1024]; //在原来上面拿个20字节存整数 int* pInt = new(pMem + 0) int[5]{ 1,2,3,4,5 }; //在原来上面拿出20个存字符 char* pChar = new(pMem + 20) char[20]{"ILoveyou"}; //等效:char* pChar = new(pInt + 5) char[20]{"ILoveyou"}; delete[] pMem; pMem = nullptr; } int main() { testOne(); testTwo(); testThree(); return 0; }



