当前位置: 首页 > news >正文

02__C++的基本语法

一、C++的标准输入输出流

1、基本输入输出

#include <iostream>   //必须添加头文件标准输入(standard input)与预定义的istream 对象cin对应   scanf标准输出(standard output) 与预定义的ostream对象cout对应  printf标准出错(standard error)与预定义的的ostream对象cerr对应  perror标准出错  ostream clog;  标准出错  出错日志输出 ,错误级别比较高标准输出:cout  标准输入:cin  标准出错:cerr ,这三个都是类对象。
初步理解类把他当成一个结构体类型,那么类对象就是结构体变量。C++里面是通过三个类对象实现 输出  输入  出错的。 
分别是 cin  cout  cerr clog 都是属于 std作用域中的。所以在使用它们的时候,需要 std::cin 或 std::cout 或 std::cerr

2、标准输入 cin (c指的是c++,in指的是input)

C的东西,C++有,C++有的,C不一定有.cin>>变量   ----不需要指定类型(基本数据类型是自动识别)比如:从键盘上获取一个整数 和  字符串,并且输出

3、标准输出 cout (c指的是c++ ,out指的是output)

cout<<变量/常量   ---不需要指定类型(基本数据类型是自动识别)
//将指定的数据输出(<<)到标准输出设备(屏幕终端)上std::cout<<"val:"<<val<<std::endl;在使用的时候,用std::指明cout 是 来自std命名空间
std::cout<<"str:"<<str<<std::endl;std::endl  代表换行  相当于  "\n"当然可以不建议这么写:std::cout<<"str:"<<str<<"\n";特点:cout会自动识别数据类型来输出,而且可以支持连续输出注意(容易出错的地方):① 现在使用cout、cin、endl一定要加上std命名空间:std::cin 、std::cout、std::endl② 在使用的时候 重载运算符 <<    >>  不要写反了③ 在使用cin标准输入的时候,不能在后面加std::endl; 即 std::cin>>val>>std::endl;  ---错误

4、完整例子:

#include<iostream>int main()
{char name[256]={0};int age;float score;std::cout<<"请输入姓名 年龄 分数:";std::cin>>name>>age>>score;std::cout<<"姓名:"<<name<<"  年龄:"<<age<<"  分数:"<<score<<std::endl;return 0;
}

二、string类型(C++语法特性之一,C没有的)

1、基本概念引入

C++是C的升级拓展,所以C++的基本变量类型和C是一样的,
但是C++语法中具有一个特殊的类型就是string类类型。string这个类型是C++的std提供的,
所以使用的时候需要std::string.string类型的理解:用来存放字符串的类型数据,是C++独有的类型,
不像C需要定义字符数组,例如下面的例子:
需要#include <string>
字符串初始化:string str_1 = "abc";字符串赋值:   string str_2;  //定义str_2 = "dfasdfasd";//赋值字符串复制: string s2 = s1; //把上面的字符串s1复制给s2  C strcpy字符串拼接: string s3 = s1+s2; 这里是非裸加,
当然也可以裸加。  string s4 = "fdsaf" + "fdsaf";   C strcat字符串对比: if(s1 == "dfs")  // 而 C是用函数:strcmp
注意:string s2, s3;
s2 = "hello";
s3 = "world";string s1 = "你" + "好";     //这里会报错,因为不能识别两个字符串类型为string而这样是可以的
string s1 = s2 + "世界";    

2、string类中的find函数

1:find函数的功能

        是在一个字符串中查找是有指定的子串,string是一个__类__,所以它里面可以有函数,它里面有一个find函数,类中的函数是被 类对象 使用的。

2:find函数的语法

    头文件:#include <string>字符串检索子串:  size_t find(const string str, size_t pos = 0);形参1: 字符串对象 --- 作为子串形参2: pos:是要在母串中哪一个位置开始找str:你要找的子串函数返回 子字符串 在 母字符串 中的下标位置,如果找到则返回第一个匹配的位置,如果没有找到则返回-1 string::npos(一个常量值,表示未找到)。

3:find的例子

#include <iostream>
#include <string>int main()
{// 定义两个类的对象std::string s1, s2;std::cout<<"请输入一个母串";std::cin>>s1;std::cout<<"输入需要查找的字串";std::cin>>s2;//在s1的母串中find字串,返回值为s1查找到的下标值size_t pos = s1.find(s2, 0);    //这个是动态的(因为有定义s1的类对象)if(pos == std::string::npos)    //std::string::npos为静态(即没有定义类对象直接使用类成员){std::cout<<"没查找到"<<std::endl;}else{//将查找的字串的位置输出来std::cout<<"字串在s1的位置下标为:"<<pos<<std::endl;}return 0;
}

运行结果:

3、string中常见的成员函数

有⭐是比较重要的

构造函数:经过函数重载string(): 创建一个空字符串。
string(const string& str): 创建一个字符串副本。 string s1 = "hello";   string s2(s1);
string(const char* s): 从 C 风格字符串创建一个字符串。 string s1("hello");
string(size_t n, char c): 创建一个字符串,长度为 n,并用字符 c 填充。 string s1(10,'o');void clear(): 清空字符串内容。⭐
bool empty() const: 判断字符串是否为空。⭐
void push_back(char c): 在字符串末尾添加一个字符。⭐
void pop_back(): 删除字符串的最后一个字符。⭐void append(const string& str): 在字符串末尾追加另一个字符串。
void append(const char* s): 在字符串末尾追加 C 风格字符串。
char& at(size_t pos): 获取指定位置的字符,若位置越界,则抛出 out_of_range 异常。 ⭐
进行内存边界检查
char& operator[](size_t pos): 获取指定位置的字符(可以修改)。

4、常见的例子

问题:给定一个字符串,判断它是否是回文字符串。回文字符串是指正着读和反着读都一样的字符串。 eg:heeh

#include <iostream>
#include <string>using namespace std;bool ishuifen(string s1);bool ishuifen(string s1)
{int str_len = s1.length();for(int index=0; index < str_len/2; index++){if(s1.at(index) != s1.at(str_len - 1 - index)){return false;}}return true;
}int main()
{string s1;while(1){cout<<"请输入一个字符串s1:"<<endl;cin>>s1;if(ishuifen(s1) == false){cout<<"不是回文"<<endl;}else{cout<<"是回文"<<endl;}}return  0;
}

运行结果:

三、C++指针和动态内存(堆)

1、对于指针变量的写法,C++编译平台更为严格,例如

用来存储地址的变量,在C语言中,如果地址类型不一致,只会报警告,
而在C++中会更为严格会直接报错,所以在C++中类型必须要一致。比如:
在C语言中
int *p = 0x12345678; //左边是int*类型,右边是int类型,类型不一致会警告在C++中
int *p = 0x12345678;会直接报错
必须强转为相同类型
int *p = (int*)0x12345678;

2、动态内存的申请和释放

c语言方式  --函数
申请堆空间  malloc, calloc   realloc
释放堆空间  freec++语言方式 ---运算符(或者也可以说是关键字)
申请堆空间  new =====》 malloc
释放堆空间  delete  ===》 free
1)申请格式和释放格式
new的申请格式:
数据类型  *变量名 = new  数据类型;//默认只会申请一个单位堆空间,至于多少字节根据数据类型确定
数据类型  *变量名 = new  数据类型(初始值); //申请内存空间的时候直接初始化
数据类型  *变量名 = new  数据类型[数据元素个数];
数据类型  *变量名 = new  数据类型[数据元素个数]{,,,,};//申请n个单位,并且初始化n个单位的值int * int_p = (int *)malloc(sizeof(int));  
int * int_p = new int;   //跟上面C的效果一样int * int_p = (int*)malloc(sizeof(int)*4);
int * int_p = new int[4];  总共申请16个字节,4个整形的堆空间, //跟上面C的效果一样释放格式:
delete  指针变量;  释放单个对象
delete  []指针变量;  释放连续的多个对象

例如:

char  *p  = new  char;     申请一个char对象空间  1个字节
char  *p  = new  char('a');   申请一个char对象并且初始化为a
char  *p  = new  char[100] ;  申请100个char对象(空间是连续) ---数组 
char  *p  = new  char[100]{"初始化"}; 申请100个char对象(空间是连续的)并且初始化  
int (*p)[5] = new int[4][5];  给一个数组指针变量p申请空间,申请4个数组,数组长度为5int *p = new int[5];         申请5个int对象(空间是连续) ---数组 

完整例子:

例子1:

#include <iostream>int main()
{int *p = new int;  //这里是申请一个单位的堆空间*p = 12;std::cout<<*p<<std::endl;delete p;         // 释放堆空间return 0;
}

 

例子2:

#include <iostream>int main()
{int *p = new int[6];  //这里是申请6个int单位的堆空间for(int index=0; index<6; index++ )  // 逐个赋值*(p + index) = index;for(int index=0; index<6; index++ )  // 逐个输出std::cout<<"p["<<index<<"]="<<*(p+index)<<std::endl;delete []p;                         // 释放堆空间return 0;
}

3、动态内存的总结

C语言中的malloc  free 是函数,C++语言中的new  delete是运算符.基本总结:
申请new 类型;  至少一个对象空间new 类型[对象个数]; 申请多个对象空间new 类型[对象个数]{初始化值}new 类型{初始化值}
释放释放一个对象 delete 指针变量;释放多个对象 delete []指针变量 ;  拓展总结: new和malloc的区别:new 在申请内存的同时,还会调用对象的构造函数(初始化),而 malloc 只会申请内存;同样,delete 在释放内存之前,会调用对象的析构函数,而 free 只会释放内存。 类中有两个基本必备的函数 构造函数 + 析构函数new的构造函数的作用是帮你初始化new出来的空间的值delele的析构函数的作用是帮你释放new出来的空间

后面还有几个语法有空补上

http://www.xdnf.cn/news/956683.html

相关文章:

  • Unity中的Mathf.Lerp
  • ArcGIS Pro+ArcGIS给你的地图加上北回归线!
  • 安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
  • 什么是EULA和DPA
  • Android Test4 Application(Context)实例的获取
  • 深入探讨渗透测试的定义、关键步骤以及实施方法
  • 《射频识别(RFID)原理与应用》期末复习 RFID第三章 编码和调制(知识点总结+习题巩固)
  • EZDML:一款国产免费的数据库建模工具
  • [25-cv-61102]SMG律所代理Fanatics 体育用品商标维权案
  • UI学习(三)
  • 嵌入式学习Day34
  • VS Code中Augment AI免费额度用尽的完美解决方案
  • CppCon 2015 学习:The Birth of Study Group 14
  • Android15默认开启无障碍服务
  • ui框架-文件上传组件
  • 高密度ARM服务器的散热设计
  • JAVA开发工具箱
  • Easy Excel
  • Shell脚本 - 查看系统信息
  • 设计模式作业
  • Unity中的Time.fixedDeltaTime
  • 9. 线性表的顺序表示和实现(1)
  • TCP和UDP区别
  • 关于 WASM:1. WASM 基础原理
  • linux 下常用变更-8
  • VisualXML全新升级 | 新增数据库编辑功能
  • 怎么让Comfyui导出的图像不包含工作流信息,
  • 三网智能切换技术如何造富?拆解格行WiFi代理的管道收益模型
  • 直播APP平台中如何实现人脸美颜功能?美颜SDK技术详解
  • React第五十七节 Router中RouterProvider使用详解及注意事项