2025.1.7(c++基础知识点)
作业(练习)
练习:要求在堆区连续申请5个int的大小空间用于存储5名学生的成绩,分别完成空间的申请、成绩的录入、升序排序、成绩输出函数以及空间释放函数,并在主程序中完成测试
要求使用new和delete完成
#include <iostream>using namespace std;//要求在堆区连续申请5个int的大小空间用于存储5名学生的成绩,分别完成空间的申请、
//成绩的录入、升序排序、成绩输出函数以及空间释放函数,并在主程序中完成测试
double *shengqin() //空间申请函数
{double *ptr = new double[5]{-1,-1,-1,-1,-1};return ptr;
}void release(double *ptr) //释放空间
{delete []ptr;ptr = NULL;
}void enter(double *ptr) //成绩录入功能
{int i=0;while(i!=5){cout<<"输入成绩:第"<<i<<"位"<<endl;double a;cin>>a;ptr[i] = a;i++;}
}void asort(double *ptr) //升序排序
{for(int i=0;i<(5-1);i++){int m=i,b;bool c = 0;b=ptr[i];for(int j=0;j<5;j++){if(ptr[j]<b){m=j;c = 1;}}//交换if(c==1){int temp1;temp1 = ptr[i];ptr[i] = ptr[m];ptr[m] = temp1;}}cout<<"交换完成:\t"<<'\t'<<endl;
}void myprintf(double *ptr)
{cout<<"成绩如下:"<<endl;for(int i=0;i<5;i++){cout<<ptr[i]<<endl;}
}int main()
{double *ptr = shengqin(); //空间申请enter(ptr); //成绩录入myprintf(ptr);asort(ptr); //升序排序myprintf(ptr); //输出release(ptr); //释放空间ptr = NULL;return 0;
}
笔记
一、C++的引入
1.1 C++的介绍
开发者:本贾尼---斯特劳斯特鲁普
Simula语言:被称为世界上第一个引入类体系(面向对象)的语言
Algol:研究的是关于算法结构
贝尔实验室:改进C语言
1983年,贝尔实验室(Bell Labs)的Bjarne Stroustrup发明了C++。 C++在C语言的基础上进行了扩充和完善,是一种面向对象程序设计(OOP)语言。
Stroustrup说:“这个名字象征着源自于C语言变化的自然演进”。还处于发展完善阶段时被称为“new C”,之后被称为“C with Class”。 C++被视为C语言的上层结构,1983年Rick Mascitti建议使用C++这个名字,就是源于C语言中的“++”操作符(变量自增)。
而且在共同的命名约定中,使用“++”以表示增强的程序。
支持面向对象编程、泛型编程和过程化编程。
编程领域广泛:常用于系统开发,引擎开发等应用领域,是最受广大程序员喜爱的编程语言之一。
历史:“C with Class”阶段,C语言基础上的特征主要有:类及派生类、共有和私有成员、构造函数和析构函数、友元、内联函数、赋值运算符的重载,等等。
1985年1.0版新增加:虚函数的概念、函数和运算符的重载、引用、常量,等等。
1989年2.0版新增加:类的保护成员、多重继承、对象的初始化与赋值的递归机制、抽象类、静态成员函数、const成员函数,等等。
1.2 C++属于半面向过程半面向对象编程语言
面向过程程序设计(Procedural Programming)和面向对象程序设计(Object-Oriented Programming, OOP)是两种常见的编程范式,它们各有特点和适用场景。
1> 面向过程:
面向过程程序设计是一种编程范式,它侧重于编写一系列计算步骤或过程的代码,每个过程都可以完成特定的任务。在这种范式中,程序被视为一系列函数的集合,数据在函数之间传递。
主要特点包括:
结构化:程序被分解为可重用的函数或过程。
功能划分:每个函数负责一个具体的任务。
顺序执行:程序按照代码的顺序执行操作。
局部变量和全局变量:数据通过参数传递给函数,函数内部通常使用局部变量,也可以使用全局变量。 面向过程编程的典型语言包括C语言。
2> 面向对象:
面向对象程序设计是基于“对象”的概念,其中对象是数据和操作数据的方法的集合。这种范式强调将现实世界的实体作为对象进行模拟,每个对象都可以接收消息、处理数据和发送消息到其他对象。
主要特点包括:
封装:隐藏对象的内部状态和实现细节,只暴露有限的操作接口。
继承:允许新的对象类继承现有对象类的属性和方法。
多态性:允许不同类的对象对同一消息做出响应。
对象实例:程序定义为对象的集合,每个对象都可以具体实例化。
面向对象编程的典型语言包括Java、C++和Python。
3> 比较
维护性:面向对象程序设计通常更易于维护和扩展,因为它强调封装和模块化。
复用性:面向对象程序设计通过继承和多态提高代码复用性。
开发效率:面向对象程序设计在处理复杂系统时,可以更快地开发,因为它提供了更多高级抽象。
1.3 C++是对C的扩充
1> C++是对C语言的扩充,C语言的所有语法及函数,C++都能继续使用,并且在该基础上进行了扩充
2> C语言的编译器是gcc,而C++的编译器是g++,并且g++编译器比gcc编译器更加严格
3> C++程序的后缀一般为 .cpp .cxx .cc .C .hpp
4> C++中的头文件,一般不以.h结尾,C++中的头文件名,就是类名
5> C语言的头文件,在C++中依然可以使用,但是C++对C语言的头文件进行了二次封装
#include -----> #include
#include -----> #include
#include<stdio.h> //在g++编译器中,如果没有加头文件,会直接报错int main(int argc, const char *argv[])
{printf("hello a\n");int num = 520; //定义一个普通整形变量void * vptr = #char * cptr = (char *)vptr; //将万能指针转换为char*的指针,g++编译器要求必须强转return 0;
}
二、第一个C++程序
2.1 在qt_creator中创建一个C++项目
2.2 第一个C++程序框架解析
#include <iostream>
//#:表示这是一条预处理指令 /
/include:表示这是一条文件包含指令
//<>:表示直接使用的是系统库中的文件
//i:input o:output stream: 引入的是输入输出流的头文件
//iostream:是由istream和ostream共同产生的一个用于进行io操作的类
using namespace std;
//这是一条命名空间的声明语句
//using:是使用命名空间的关键字
//namespace:是命名空间的关键字
//std:标准命名空间,系统提供的所有的名字,都会放入到该命名空间中
int main()
//提供的是无参的主程序,也就是不需要外部传参
{ cout << "Hello World!" << endl << 520 << 1314<<'\t'<<3.14;
cout<<"hello world";
cout<<endl;
//使用iostream中的类对象cout输出数据hello world 类似于 printf
//<< :插入运算符,是一个运算符,不是左移运算,是C++重载的运算符,跟cout搭配用于输出,类似于 printf后的括号
//"Hello World!" :原样输出的内容
//第二个尖括号,表示再次输出内容
//endl: end line :换行,类似于C语言的 '\n'
//cout:会自动识别要输出的数据类型并输出
return 0; }
三、C++中的输入输出
3.1 输出操作
1> 在C++中,向终端输出数据,使用的是ostream提供的一个类对象(结构体变量) cout,搭配插入运算符(<<)一起用作输出
2> cout输出数据时,不需要使用格式控制符,会自动识别要输出的数据的数据类型
3> cout输出数据时,可以级联输出数据,级联输出时,需要使用多个插入运算符
#include <iostream>using namespace std;int main()
{cout << "Hello World!" << endl; //输出一个字符串int numb = 24101;char Class[20] = "班级";double score = 88.8;cout << numb <<endl; //输出一个整数cout << Class <<endl; //输出一个字符数组cout << score <<endl; //输出一个实数return 0;
}
练习:使用cout输出斐波那契数列前20项
1 1 2 3 5 8 13 。。。
#include <iostream>using namespace std;int main()
{int a[20]; //用于存储20项数据for(int i=0;i<20;i++) //循环给数组的每个元素赋值{if(i<2) //前两项数据全为1{a[i] = 1;}else{a[i] = a[i-2] + a[i-1]; //从第三项开始,每一项等于前两项的和}}cout<<"斐波那契数列前20项分别是:";for(int i=0; i<20; i++){cout<<a[i]<<'\t';}cout<<endl;
}
3.2 cout的格式化输出(了解)
#include <iostream>
#include<iomanip>
//有关格式化输出函数的头文件
using namespace std;
int main()
{ int num = 1010;
cout<< "num = " << num <<endl; //默认输出的是十进制数据 1010
/********************使用关键字设置进制数的输出**************************/
cout<< oct <<"num = " << num <<endl; //输出的就是八进制数据 1762
cout<< "num = " << num <<endl; //后面输出的数据都是八进制数
cout<< hex <<"num = " << num <<endl; //输出的是十六进制数据 3f2
cout<< "num = " << num <<endl; //后面输出的数据都是十六进制数
cout<< dec <<"num = " << num <<endl; //后面输出的数据都是十进制数 /************************使用函数完成进制数的输出***********************/
cout<<"*******************************************************\n";
cout<< setbase(8) <<"num = " << num <<endl; //输出八进制数据 1762
cout<< "num = " << num <<endl; //后面输出的数据都是八进制数
cout<< setbase(16) <<"num = " << num <<endl; //输出十六进制数据 3f2
cout<< setbase(10) <<"num = " << num <<endl; //输出十进制数据 1010
cout<< setbase(7) <<"num = " << num <<endl; //设置其他进制默认是十进制 cout<<"*******************************************************\n";
/************************printf("%-10d", 520);***********************/
cout <<"num = " << setw(10)<< right <<num <<endl; //至少提供10个位置,用于数据输出,右对齐
cout <<"num = " << setw(10)<< left << num <<endl; 至少提供10个位置,用于数据输出,左对齐
cout<<"*******************************************************\n"; /***************************输出小数**********************************/
double PI = 31.4159265358;
cout<<"PI = "<<PI<<endl; //默认保留6位有效数字,如果超过,则使用科学计数法
cout<< setprecision(10) <<"PI = "<<PI<<endl; //保留10个有效数字
cout<< fixed <<setprecision(2) <<"PI = "<<PI<<endl; //保留两位小数 setprecision和fixed表示保留小数点后n位
return 0; }
3.3 输入操作 cin
1> C++中的输入使用的是istream提供的一个类对象 cin, 并结合提取运算符 (>>)一起使用,用作数据的输入
2> cin进行输入时,也无需使用格式控制符,系统直接自动识别数据类型并输入
3> 输入数据时吗,一般也不使用endl
#include <iostream>using namespace std;int main()
{int num = 0; //整形数据cout<<"请输入num的值:";cin >> num; //输入整形数据cout <<"num = "<<num<<endl; //cout<<"********************************\n";char key = 0; //字符数据cout<<"请输入key的值:";cin >> key; //输入字符数据cout <<"key = "<<key<<endl; //cout<<"********************************\n";char name[20] = ""; //字符串数据cout<<"请输入name的值:";cin >> name; //输入字符串数据cout <<"name = "<<name<<endl; //cout << "Hello World!" << endl;return 0;
}
练习:提示并输入一个字符,如果是大写转变成小写,如果是小写转变成大写,如果是其他字符,都转变成 * ,输出转变后的数据
要求使用cin和cout完成
#include <iostream>using namespace std;int main()
{char n; //定义变量存储数据cout<<"请输入一个字符:";cin>>n; //输入一个字符数据if (n>='A'&&n<='Z') //判断大写字母{n=n+32; //将大写转变成小写//cout << n+32 << endl; //输出的是整数}else if(n>='a'&& n<='z'){n=n-32; //小写转大写}else{n = '*';}cout<<"n = "<<n<<endl; //输出结果return 0;
}
四、命名空间
4.1 命名空间的引入
1> 命名空间是防止在多人协同开发过程中,命名污染问题
2> 相当于给标识符起个“姓氏”
3> 程序中常用的标识符:变量名、数组名、指针名、结构体名、函数名、枚举名、共用体名
4> 命名空间可以分为系统提供的名字空间 std 和自定义的命名空间
4.2 使用系统提供的命名空间
1> 连名带性一起使用,但是,需要在名字前面加上命名空间名和作用域限定符(::)
2> 将命名空间中的某个名字,做提前声明,后期使用该名字时可以直接用,不需要加命名空间名和作用域限定符
3> 将整个命名空间进行前置声明,后面使用该命名空间中的任意一个名字都无需加命名空间名和作用域限定符了
#include <iostream> //该头文件中,提供了std命名空间的定义,但是,当使用名字时,需要进行声明int main()
{//命名空间使用 方式1:连名带性一起使用std::cout << "hello a" << std::endl;//命名空间使用方式2:将命名空间中某个名字进行前置声明using std::cout; //表示将命名空间std中的cout声明一下cout << "你好" << std::endl; //此时cout可以使用,因为前置声明了,但是endl不能使用,因为没有声明//命名空间的使用方式3:将整个命名空间全部进行声明using namespace std; //将std整个命名空间全部声明cout<<"愿世界和平"<<endl;return 0;
}
4.3 自定义命名空间
1> 定义格式
namespace 命名空间名
{ 类型名 名称;
。。。 } //不需要使用分号结尾
2> 命名空间中如果有函数,则一般使用的是命名空间中声明,命名空间外定义
3> 同一个作用域下,可以定义多个同名的命名空间,但是要求命名空间中的名字不能相同,后期系统会自动将多个命名空间合并成一个命名空间
#include <iostream>
#include<iomanip>
using namespace std;//自定义命名空间
namespace zpp
{int num; //定义整形变量int *ptr; //定义指针变量//在命名空间中定义一个函数void show(); //命名空间内声明}//定义同名的命名空间
namespace zpp
{int key = 1234; //可以定义命名空间时给成员初始化//int num; //不能定义同名的名字}//命名空间外定义
void zpp::show() //注意,需要在名字前面加上命名空间名和作用域限定符表示定义的是哪个命名空间中的函数
{cout<<"num = "<<num<<" *ptr = "<<*ptr<<endl;cout<<"key = "<<key;
}/********************************主程序*************************/
int main()
{zpp::num = 1314; //命名空间使用方式1using zpp::ptr; //命名空间使用方式2,将命名空间中的某个名字声明ptr = &zpp::num; //前置声明了的名字可以直接使用,没有声明的需要加上命名空间名和作用域限定符using namespace zpp; //命名空间释放方式3show(); //使用命名空间中的函数return 0;
}
4.4 命名空间中的名字冲突问题
1> 不同的命名空间中的名字冲突时,如果两个吗,命名空间全部进行整体声明了,那么需要在使用冲突的名字前加命名空间名和作用域限定符用于区分。
2> 命名空间中的名字与全局变量(匿名空间)名字冲突,也要使用命名空间名和作用域限定符进行区分,匿名空间中的名字使用方式为 ::名字
3> 命名空间中的名字和局部变量的名字冲突,优先使用局部变量,如果非要使用命名空间中的名字,需要加上命名空间名和作用域限定符
#include <iostream>
#include<string.h>using namespace std;//自定义张三的命名空间
namespace zhangs
{int num = 520;char name[20] = "";
}//自定义李四的命名空间
namespace lisi
{int num = 1314;double score = 99.5;
}//将两个命名空间都进行声明
using namespace zhangs;
using namespace lisi;float score = 33.33; //定义全局变量 全局变量中的名字,会默认放入的匿名空间中int main()
{//命名空间中的名字和匿名空间中的名字冲突lisi::score = 100; //使用的是李四命名空间中的名字::score = 66.66; //此时使用的是全局变量(匿名空间中的名字)strcpy(name, "张三"); //使用的是张三命名空间中的名字//不同命名空间中的名字冲突zhangs::num = 666; //冲突, 需要加上命名空间名和作用域限定符lisi::num = 999; //使用的是李四命名空间中的名字//当局部变量和命名空间中的名字冲突时,优先使用局部变量int name = 1111;cout<<"name = "<<name<<endl; //使用的是局部变量cout<<"name = "<<zhangs::name<<endl; //使用的是命名空间中的名字return 0;
}
五、C++对C语言字符串的扩充
5.1 C++中支持的字符串
1> C语言中没有字符串类型,所有有关字符串的操作,都是基于字符数组完成的 ----> C风格的字符串
'\0'是C风格字符串的结束标识
2> C++支持两种风格的字符串
1、C风格的字符串 可以使用字符数组处理,也可以使用 const char *的指针表示
2、C++中支持string类型
3> C++中支持字符串类型 string ,如果使用该类型的函数,一般引入头文件 #include
4> 注意:处理C语言风格的字符串的函数所在的头文件为 #include 或 #include
5.2 C++风格字符串的定义及初始化
1> 单个变量的定义及初始化
#include <iostream>using namespace std;int main()
{//1、定义一个字符串变量 :如果不初始化,则该字符串是一个空串string s1; // 无参构造函数cout<<"s1 = "<< s1 <<endl; // 是一个空串//2、定义一个字符串变量,并初始化string s2 = "hello a"; //拷贝构造函数cout<<"s2 = "<<s2<<endl; //hello a//3、定义一个字符串并初始化string s3 = {"hello world"};cout<<"s3 = "<<s3<<endl; //hello world//4、定义一个字符串并初始化string s4("你 好"); //有参构造函数cout<<"s4 = "<<s4<<endl; //你 好//5、定义一个字符串并初始化string s5(5, 'A'); //有参构造函数cout<<"s5 = "<<s5<<endl; //AAAAA//6、对字符串变量的赋值s1 = "逆天了"; //拷贝赋值函数 //C++风格 的字符串的赋值,不需要使用strcpy完成可以直接使用赋值运算符cout<<"s1 = "<<s1<<endl; //逆天了return 0;
}
2> 多个变量的初始化及赋值
#include <iostream>using namespace std;int main()
{string s1 = "hello a"; //定义一个字符串变量并初始化//定义一个字符串变量,并使用另一个字符串给其进行初始化string s2 = s1;cout<<"s2 = "<<s2<<endl; //hello a//定义一个字符串变量,使用另一个字符串给其进行初始化string s3(s2);cout<<"s3 = "<<s3<<endl; //hello a//定义一个字符串变量,使用另一个字符串变量给其进行初始化string s4 = {s1};cout <<"s4 = " << s4<<endl; //hello a//定义一个字符串使用另一个字符串给其进行赋值string s5;s5 = s1; //不需要使用strcpy,直接使用赋值运算符完成两个字符串变量的赋值cout<<"s5 = "<<s5<<endl; //hello a//定义一个字符串,使用两个字符串连接后的结果进行初始化string s6 = s1+s2; //s1+s2表示将s2连接到s1后面 取代了strcat的功能cout<<"s6 = "<<s6<<endl; //hello ahello a//定义一个字符串使用一个字符串变量与一个字符串常量拼接后的结果初始化string s7 = s1 + " 世界";cout<<"s7 = "<<s7<<endl; //hello a 世界// 定义一个字符数,使用一个字符串常量和一个字符串变量拼接后的结果初始化string s8 = "滴滴滴 " + s1;cout<<"s8 = "<<s8<<endl; //滴滴滴 hello a//string s9 = "hello " + "world"; //两个字符串常量是不能进行加法运算return 0;
}
5.3 C风格字符串和C++风格字符串的相互转换
1> C风格字符串可以无条件直接转换为C++风格的字符串
2> C++风格的字符串转换为C风格的字符串需要调用成员函数 c_str() 或者 data()函数
#include <iostream>
#include<cstring> //#include<string.h>using namespace std;int main()
{char str[20] = "hello a"; //C语言风格的字符串string s1 = str; //c风格的字符串可以直接转换为C++风格的字符串cout<<"str = "<<str<<endl; //hello acout<<"s1 = "<<s1<<endl; //hello as1 = "24101班"; //C++风格字符串的赋值//将C++风格的字符串转变成C语言风格的字符串需要调用成员函数 : data() 或者 c_str()strcpy(str, s1.c_str());//str = s1; //不可以,不能将C++风格字符串直接转换为C风格字符串strcpy(str, s1.data());//s1是C++风格的字符串, 可以通过s1.c_str()或者s1.data() 找到s1对应的C风格字符串cout<<"str = "<<str<<endl; //24101班cout<<"s1 = "<<s1<<endl; //24101班return 0;
}
5.4 C++风格的字符串的比较
1> C风格的字符串的比较不能使用关系运算符,只能使用strcmp来完成
2> C++风格的字符串可以直接使用关系运算符完成字符串的比较
#include <iostream>
#include<cstring>using namespace std;int main()
{string s1 = "hello";string s2 = "world";//C++风格的字符串的比较可以直接使用关系运算符来完成 不需要使用strcmpif(s1>s2){cout<<s1<<"大"<<endl;}else if(s1 < s2){cout<<s2<<"大"<<endl;}else{cout<<"一样大"<<endl;}strcmp(s1.data(), s2.data()); //如果非要使用strcmp,需要转换成c风格的字符串进行比较return 0;
}
5.5 string类型常用的成员函数
1> size()或者length():求该字符串的实际长度
2> 访问字符串的成员
1、使用成员函数 at() 完成,会进行下标越界检查
2、使用中括号运算符完成,不进行下标越界检查
3> 判空:empty(),如果字符串为空,则返回真,否则返回假
4> 清空:clear() 将当前字符串清空
5> 尾插:push_back() 在字符串尾部插入一个字符
尾删:pop_back() 删除字符串尾部的那个字符
#include <iostream>using namespace std;int main()
{string s1 = "I love China";//求该字符串的实际长度cout<<"sizeof(s1) = "<<sizeof (s1)<<endl; //求变量的空间大小 32cout<<"size of s1 = "<<s1.size()<<endl; //求字符串实际长度 12cout<<"size of s1 = "<<s1.length()<<endl; //求字符串实际长度 12//更改字符串中的某个字符s1[2] = 'L'; //使用下标运算符,是不进行下标越界检查的cout<<"s1 = "<<s1<<endl; //I Love Chinas1.at(2) = 'B'; //使用成员函数获取字符串中某个字符 是对字符串进行下标越界检查cout<<"s1 = "<<s1<<endl; //I Bove China//判断当前字符串是否为空if(s1.empty()){cout<<"s1字符串为空"<<endl;}else{cout<<"s1字符串非空"<<endl;}//清空当前字符串s1.clear();//判断当前字符串是否为空if(s1.empty()){cout<<"s1字符串为空"<<endl;}else{cout<<"s1字符串非空"<<endl;}cout<<"s1 = "<<s1<<endl; //空串//对字符串进行尾插s1.push_back('A');s1.push_back('B');s1.push_back('C');cout<<"s1 = "<<s1<<endl; //ABC//对字符串进行尾删s1.pop_back();cout<<"s1 = "<<s1<<endl; //ABreturn 0;
}
5.6 C++风格字符串的输入
1> 不带空格的输入:可以直接使用cin完成
2> 带空格的输入: 使用全局函数 getline()来完成
#include <iostream>using namespace std;int main()
{string s1; //定义一个字符串变量/*cout<<"请输入一个字符串:";cin >> s1; //输入不带空格的字符串cout<<"s1 = "<<s1<<endl;*/cout<<"请输入一个字符串:";getline(cin, s1); //既可以输入有空格的字符串,也可以输入没有空格的字符串cout<<"s1 = "<<s1<<endl;return 0;
}
练习:提示并输入一个字符串,统计该字符串中字母字符个数、数字字符个数、空格字符个数以及其他字符的个数并输出
要求使用C++风格字符串完成
#include <iostream>using namespace std;int main()
{string s1; //用于存储字符串的变量while(1){cout<<"请输入字符串:";getline(cin,s1); //因为可能存在空格,所以只能使用getline函数int snum=0;int znum=0;int onum=0;int knum=0;for(unsigned int i=0; i<s1.size(); i++) //遍历整个字符串{if(s1[i]>='a'&&s1[i]<='z') //判断是否为小写字母{znum++;}else if(s1[i]>='A'&&s1[i]<='Z') //判断是否为大写字母{znum++;}else if(s1[i]>='0'&&s1[i]<='9') //判断是否为数字字符{snum++;}else if(s1[i]==' ') //判断是否为空格{knum++;}else{onum++; //判断是否为其他字符}}cout<<"字母字符数:"<<znum<<endl;cout<<"数字字符数:"<<snum<<endl;cout<<"空格数:"<<knum<<endl;cout<<"其他字符数"<<onum<<endl;}cout << "Hello World!" << endl;return 0;
}
六、bool类型
1> C语言是不支持bool类型的,但是C++支持bool类型
2> bool类型属于C++的基本数据类型
3> bool类型的数据的值只有两个:true(非0数字)、false(0)
4> 由于bool类型的出现,给C++的关键字多个三个,bool、true、false
5> bool类型的数据有两种表示方式,默认使用的是数字表示真假,所有非0数字都表示真,0表示假
如果想要使用单词(true、false)表示真假,则需要使用关键字boolalpha来设置
如果还想继续使用数字表示真假,则需要使用关键字noboolalpha来设置
6> bool类型所占内存大小:本质上只需要 1bit ,但是由于内存分配的基本单位是字节,所有bool类型占1字节内存
#include <iostream>using namespace std;int main()
{//bool类型的 数据默认使用数字表示真假bool b1 = 10; //定义一个bool类型的变量并初始化cout<<"b1 = "<<b1<<endl; // 1bool b2 = -10;cout<<"b2 = "<<b2<<endl; // 1bool b3 = 0;cout<<"b3 = "<<b3<<endl; // 0//使用单词表示真假cout<<"*************************************\n";cout<<boolalpha<<"b1 = "<<b1<<endl; // truecout<<"b2 = "<<b2<<endl; // truecout<<"b3 = "<<b3<<endl; // false//继续使用数字表示cout<<"*************************************\n";cout<<noboolalpha<<"b1 = "<<b1<<endl; // 1cout<<"b2 = "<<b2<<endl; // 1cout<<"b3 = "<<b3<<endl; // 0cout<<"*************************************\n";bool b4 = true;cout<<"b4 = "<<b4<<endl; //1bool b5 = false;cout<<"b5 = "<<b5<<endl; //0cout<<"*************************************\n";cout<<"sizeof(bool) = "<<sizeof (bool)<<endl; //1return 0;
}
七、C++对堆区空间使用的扩充
7.1 引入 new/delete
1> C语言中,对堆区空间的使用,由函数malloc\free来完成
2> C++中也可以用上面的两个函数完成对堆区空间的使用,但是C++提供了专门的两个关键字用于对堆区空间的使用
new / delete
7.2 new和delete的使用
1> C++中的堆区空间的使用分为单个空间的申请和释放以及连续空间的申请和释放
2> 单个空间的申请和释放
申请格式:数据类型 *指针名 = new 数据类型;
释放格式:delete 指针名;
#include <iostream>using namespace std;int main()
{//在堆区空间申请一个int类型的空间大小int *p1 = new int; //如果没有初始化,默认是随机值cout<<"*p1 = "<<*p1<<endl; //随机值*p1 = 520; //使用堆区空间cout<<"*p1 = "<<*p1<<endl; //520//在堆区申请一个double类型的空间并初始化double *dptr = new double(99.99);cout<<"*dptr = "<<*dptr<<endl; //99.99//在堆区申请空间并初始化char *cptr = new char{'G'};cout<<"*cptr = "<<*cptr<<endl;// 释放堆区空间delete p1;p1 = NULL; //防止野指针delete dptr;dptr = NULL;delete cptr;cptr = NULL;return 0;
}
3> 连续内存的申请和释放
申请格式:数据类型 *指针名 = new 数据类型[申请的个数];
释放格式:delete []指针名;
#include <iostream>using namespace std;int main()
{//在堆区连续申请5个int类型的空间int *iptr = new int[5]; //iptr[0]、。。。、iptr[4]for(int i=0; i<5; i++){cout<<iptr[i]<<" ";}cout<<endl;//在堆区申请连续的存储空间并初始化double *dptr = new double[3]{3.14,5.67,99.99};for(int i=0; i<3; i++){cout<<dptr[i]<<" ";}cout<<endl;//释放堆区空间delete []iptr;iptr = NULL;delete []dptr;dptr = NULL;return 0;
}
思维导图
相关文章:

2025.1.7(c++基础知识点)
作业(练习) 练习:要求在堆区连续申请5个int的大小空间用于存储5名学生的成绩,分别完成空间的申请、成绩的录入、升序排序、成绩输出函数以及空间释放函数,并在主程序中完成测试 要求使用new和delete完成 #include &…...

jenkins入门12-- 权限管理
Jenkins的权限管理 由于jenkins默认的权限管理体系不支持用户组或角色的配置,因此需要安装第三发插件来支持角色的配置,我们使用Role-based Authorization Strategy 插件 只有项目读权限 只有某个项目执行权限...

Edge SCDN高效防护与智能加速
当今数字化时代,网络安全和内容分发效率已成为企业业务发展的关键因素。酷盾安全推出了Edge SCDN解决方案,为企业提供全方位的安全防护和高效的内容分发服务。 一、卓越的安全防护能力 1.DDoS攻击的精准防御:Edge SCDN具备强大的DDoS攻击检测…...
Ubuntu22.04配置静态ip
1. 编辑网络配置文件 sudo vim /etc/netplan/00-installer-config.yaml 2.输入下面配置 将静态ip设置为192.168.3.200 ,并设置路由器地址192.168.3.1,以及dns地址 223.5.5.5和223.6.6.6 dhcp4: false 表示取消动态分配ip network:ethernets:e…...

[Linux]线程的互斥与同步
目录 一、互斥 1.互斥的概念 2.互斥锁接口 3.线程加锁解锁本质 4.死锁 二、同步 1.同步的概念 2.条件变量 3.条件变量接口 一、互斥 1.互斥的概念 互斥指的是任何时刻,互斥保证有且只有一个执行流进入临界区,进行临界资源的访问,通…...
Java:缓存:LinkedHashMap实现Lru
文章目录 Lru源码分析 LinkedHashMap维护一个LinkedHashMapEntry<K,V>的双向链表对LinkedHashMap的增删查操作,也会对链表进行相同的操作并改变链表的链接顺序小结使用方法应用总结Lru Least Recently Used,…...

【形式篇】年终总结怎么写:PPT如何将内容更好地表现出来
——细节满满,看完立马写出一篇合格的PPT 总述 形式服务于内容,同时合理的形式可以更好地表达和彰显内容 年终总结作为汇报型PPT,内容一定是第一位的,在内容篇(可点击查看)已经很详细地给出了提纲思路,那如何落实到…...

自定义字典转换器用于easyExcel 导入导出
文章目录 引言I 字典转换器、注解、序列化器注解定义自定义字典转换器用于easyExcel 导入导出自定义字典序列化器II 字典存储设计数据库表结构redis缓存引言 需求导入Excel时,根据字典内容或者字段编码转换 导出Excel时,根据字典内容或者字段编码转换 接口响应数据序列化时,…...

0 Token 间间隔 100% GPU 利用率,百度百舸 AIAK 大模型推理引擎极限优化 TPS
1. 什么是大模型推理引擎 大模型推理引擎是生成式语言模型运转的发动机,是接受客户输入 prompt 和生成返回 response 的枢纽,也是拉起异构硬件,将物理电能转换为人类知识的变形金刚。 大模型推理引擎的基本工作模式可以概括为,…...

js:事件流
事件流 事件流是指事件完整执行过程中的流动路径 一个事件流需要经过两个阶段:捕获阶段,冒泡阶段 捕获阶段是在dom树里获取目标元素的过程,从大到小 冒泡阶段是获取以后回到开始,从小到大,像冒泡一样 实际开发中大…...
Linux对比Windows
1. 性能和资源占用 Linux 更轻量级:Linux 内核设计简洁,占用系统资源(如内存、CPU)较少,适合高负载的服务器环境。 高效的多任务处理:Linux 在多任务处理和并发请求方面表现优异,适合处理大量并…...

Excel 技巧03 - 如何对齐小数位数? (★)如何去掉小数点?如何不四舍五入去掉小数点?
这几个有点儿关联,我都给放到一起了,不影响大家分别使用。 目录 1,如何对齐小数位数? 2,如何去掉小数点? 3,如何不四舍五入去掉小数点? 1,如何对齐小数位数ÿ…...

Vue3国际化多语言的切换
参考链接: link Vue3国际化多语言的切换 一、安装 vue-i18n 和 element-plus vue-i18n 是一个国际化插件,专为 Vue.js 应用程序设计,用于实现多语言支持。它允许你将应用程序的文本、格式和消息转换为用户的首选语言,从而提供本地化体验。…...

使用XAML语言仿写BiliBil登录界面
实现步骤 实现左右布局 使用了Grid两列的网格布局,第一列宽度占35%,第二列宽度占65%。使用容器布局Border包裹左右布局内容,设置背景色、设置圆角 <!-- 定义两列--> <Grid.ColumnDefinitions><ColumnDefinition Width &quo…...
机器学习和深度学习
机器学习(Machine Learning,简称 ML)和深度学习(Deep Learning,简称 DL)都是人工智能(AI)领域的重要技术,它们的目标是使计算机通过数据学习和自主改进,从而完…...
Word表格批量提取数据到Excel,Word导出到Excel,我爱excel
Word表格批量提取数据到Excel,Word导出到Excel - 我爱Excel助你高效办公 在日常办公中,Word表格常常用于记录和整理数据,但将这些数据从Word提取到Excel,特别是当涉及多个文件时,常常让人头疼。如果你经常需要将多个W…...
SpringSecurity抛出异常但AccessDeniedHandler不生效
文章目录 复现原因 复现 Beanpublic SecurityFilterChain securedFilterChain(HttpSecurity http) throws Exception {//...//异常http.exceptionHandling(except -> {except.authenticationEntryPoint(new SecurityAuthenticationEntryPoint());except.accessDeniedHandle…...

高清绘画素材3600多张动漫线稿线描上色练习参考插画原画
工作之余来欣赏一波线稿,不务正业版... 很多很多的线稿... 百度网盘 请输入提取码...

EXCEL技巧
1. EXCEL技巧 1.1. 截取表格内某个字符之前的所有字符 1.1.1.样例 在单元格内输入函数: # 截取A1单元格内“分”字符左边的所有字符 LEFT(A1,FIND("分",A1)-1)1.1.2.截图...

python制作翻译软件
本文复刻此教程:制作属于自己的翻译软件-很简单【Python】_哔哩哔哩_bilibili 一、明确需求(以搜狗翻译为例) (1)网址:https://fanyi.sogou.com/text (2) 数据:翻译内容…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...