嵌入式入门Day38
C++ Day1
- 第一个C++程序
- C++中的输入输出
- 输出操作
- cout
- cin
- 练习
- 命名空间
- 使用方法
- 自定义命名空间
- 冲突问题
- C++对字符串的扩充
- C++风格字符串的使用
- 定义以及初始化
- C++风格字符串与C风格字符串的转换
- C++风格的字符串的关系运算
- 常用的成员变量
- 输入方法
- 布尔类型
- C++对堆区空间使用的扩充
- 作业
第一个C++程序
#include <iostream>
using namespace std;
//命名空间的声明语句
//using:使用命名空间的关键字
//namespace:命名空间的关键字
//std:标准命名空间,系统提供的所有名字,都放放入到该命名空间中
int main() //默认无参的主程序
{
cout << "Hello World!" << endl;
//使用iostream中的类对象cout输出数据hello world
// <<:插入运算符(不是左移运算),C++重载的运算符,与cout搭配用于输出
// endl:end line,结束该行,即换行
return 0;
}
C++中的输入输出
输出操作
cout
- 在C++中, 向终端输出数据,使用的是ostream提供的一个类对象 cout,搭配<<插入运算符使用
- cout输出数据时,不需要使用格式控制符,会自动识别要输出的数据的数据类型
- cout输出数据时,可以级联输出数据,级联输出时,需要使用多个插入运算符
cin
- 在C++中输入使用的是istream提供的一个类对象 cin,搭配>>提取运算符使用
- cin输入的时候也不需要使用格式控制符,会自动识别
练习
使用cout输出斐波那契数列前20项
#include <iostream>
using namespace std;
int main()
{
//初始化斐波那契数列前两项
int numb[20] = {1 ,1};
int i = 0;
//后面的项均为前两项的和
for( i = 2; i < 20; i++)
{
numb[i] = numb[i - 1] + numb[i - 2];
}
//循环输出
for( i = 0; i < 20; i++)
{
cout << numb[i] << '\t';
}
cout << endl;
return 0;
}
命名空间
- 命名空间是防止在多人协同开发过程中出现命名冲突的问题
- 相当于给定义的变量名函数名等标识符取一个“姓氏”
使用方法
- 使用时单独标注命名空间
- 为单个标识符声明,声明后将不需要为这个变量标注他的命名空间
- 直接声明整个命名空间,声明后每一个标识符都不需要再单独标志的了
#include <iostream>
int main()
{
//方法1
std::cout << "hello" << std::endl;
//方法2
using std::cout;
cout << "hello" << std::endl; //此处cout已经声明不需要标注命名空间,而endl需要
//方法3
using namespace std;
cout << "hello" << endl; //整个空间均被声明,都可以直接使用
return 0;
}
自定义命名空间
//定义格式
namespace 空间名 {
... //各种定义
}
同一作用域下,可以定义多个重名的命名空间,他们都将会是同一空间,里面的变量名等不允许相同
冲突问题
如果不加命名空间标识的话,当声明的命名空间之中,或者和局部变量以及全局变量有冲突的时候,就不能使用后两种方法来访问了,只能用方法1标识此时使用的到底是哪个命名空间里面的变量
本文件中的局部变量和全局变量都默认放入匿名命名空间中
#include <iostream>
namespace EKKO {
int num = 520;
}
using namespace std;
int main(void)
{
int num = 1314;
using namespace EKKO;
//此后有两个num,使用是必须标注命名空间
cout << EKKO::num << endl; //输出520
cout << ::num << endl; //输出1314
return 0;
}
C++对字符串的扩充
C语言中没有字符串类型,所有字符串的操作都是使用字符数组进行的
C++中也支持这种字符串,并且扩充了字符串类型string,使用时需要引入头文件 string
C++风格字符串的使用
定义以及初始化
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
//定义字符串
string s1;
cout << s1 << endl; //默认是空串
//定义并初始化字符串
string s2 = "HELLO";
//C++风格的字符串支持使用=直接赋值
//下面是其他的初始化方法
string s3 = {"HELLO"};
string s4("HELLO");
string s5(5, 'A'); //该串的内容为:AAAAA
//赋值操作
s1 = "与众不同";
//可以直接赋值
s1 = s2+s3; //将会把s3拼接到s2后面并赋值给s1
//注意使用字符串的加法操作时,必须有一个是字符串变量,如果两个都是字符串常量的话将会报错
return 0;
}
C++风格字符串与C风格字符串的转换
#include <iostream>
#include <string>
#include <cstring> //同#include <string.h>
using namespace std;
int main(void)
{
char str[20] = "Hello";
//C风格可以直接转换为C++风格
string s = str;
//C++风格转换到C风格则需调用成员函数
strcpy( str, s1.c_str());
strcpy( str, s1.data());
//两个成员函数的返回值都是 char *类型,指向字符串的开头,这样才符合C风格的使用方法
//本质上而言就是C风格的函数无法识别string类,需要一个char *类型的参数
return 0;
}
C++风格的字符串的关系运算
C++风格的字符串可以直接使用关系运算符
== 即可完成以前strcmp的功能
常用的成员变量
- size()或者length():求该字符串的实际长度
- 访问字符串的成员
- 使用成员函数 at() 完成,会进行下标越界检查
- 使用中括号运算符完成,不进行下标越界检查
- 判空:empty(),如果字符串为空,则返回真,否则返回假
- 清空:clear() 将当前字符串清空
- 尾插:push_back() 在字符串尾部插入一个字符
- 尾删:pop_back() 删除字符串尾部的那个字符
输入方法
- 不带空格的字符串可以直接使用cin输入
- 带空格的字符串需要使用函数getline()来完成
布尔类型
C++添加的新类型,是基本数据类型
bool类型的值只有两个:true、false
以上三个单词均为C++新添加的关键词
默认输入时bool类型只会输出0或者1,使用boolalpha关键字来修改cout可以设置为单词输出输出为true或者false,使用noboolalpha来取消
bool类型占一个字节
C++对堆区空间使用的扩充
引入了两个新的关键字来申请和释放堆区空间
new 和 delete
申请方法
//数据类型 *指针名 = new 数据类型; new是基于数据类型大小来申请的,而不是malloc的根据字节数来申请
int *p = new int;
//申请并且初始化
double *dptr = new double(3.13);
float *fptr = new float{33.33};
//连续空间的申请
int *ptr = new int[5];
//连续申请并且初始化
int *sptr = new int[5]{1,2,3,4,5};
//释放堆区空间
delete p;
p = NULL;
delete dptr;
dptr = NULL;
delete fptr;
fptr = NULL;
delete [] ptr;
ptr = NULL;
delete [] sptr;
sptr = NULL;
作业
要求在堆区连续申请5个int的大小空间用于存储5名学生的成绩,分别完成空间的申请、成绩的录入、升序排序、成绩输出函数以及空间释放函数
#include <iostream>
#include <string>
using namespace std;
int main()
{
//空间申请
int *ptr = new int[5];
//信息提示
cout << "请输入学生的成绩:";
//循环输入
for(int i = 0; i < 5; i++) {
cin >> ptr[i];
}
//冒泡排序
for(int i = 0; i < 5; i++){
for(int j = 1; j < 5-i; j++){
if(ptr[j] > ptr[j-1]){
int temp = ptr[j];
ptr[j] = ptr[j-1];
ptr[j-1] = temp;
}
}
}
//输出成绩
for(int i = 0; i < 5; i++){
cout << ptr[i] << " ";
}
cout << endl;
//释放堆区空间
delete [] ptr;
ptr = NULL;
return 0;
}