栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【系统开发基础储备】C/C++语言语法应用踩过的坑(第二篇)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【系统开发基础储备】C/C++语言语法应用踩过的坑(第二篇)

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
TODO:写完再整理

文章目录
  • 系列文章目录
  • 前言
  • 一、C++内置库支持【库->API】
    • 1.内置库和API函数的关系
    • 2.std、STL库及其API函数
      • (1)【数据结构类】
        • (1)std::vector
        • (2)isnan()函数
        • (3)isinf()函数
      • (2)【数据结构处理类】
      • (3)【输入输出类】
      • (4)【算数运算类】
        • (1)fabs()
        • (2)sqrt()
        • (3)Hypot(x,y,z)
        • (4)norm()
        • (5)std::floor()和std:ceil()
        • (6)dot()函数
      • (5)【文件读取类】
        • (1)Std::ifstream()
        • (2)Std::Isstringstream()
        • (3)Std::getline()
  • 二、C++的语法知识
    • (1)using与namespace的作用
      • (1)namespace作用
      • (2)using的作用
    • (2)函数类型及返回
      • (1)尽量不要写void类型的函数
      • (2)函数形参传值和传址方法
    • (3)C++的数据类型
      • (1)NULL和nullptr数据类型
      • (2)const常量型变量
      • (3)vector的数据类型理解
      • (4)auto数据类型
    • (4)C/C++语法避坑
      • (1)判断语句语法 (a>b)?a:b
      • (2)尽量不要在if、while(for)语句中定义变量,
    • (5)C++的操作符
      • 1、A.B【.是成员调用操作符】
      • 2、A->B【->是成员提取操作符】
      • 3、A::B【::是作用域运算符】
      • 4、A:B【:是集成运算符】
    • (6)C++类的语法
      • (1)一个类中,类内的函数和变量可以相互调用
      • (2)一个类中,在.h类内进行声明不用加上类名
      • (3)同一个类实例化不同的对象,对象是独立的
      • (4)虚函数【工厂模式】
      • (5)类的单例Instance()
    • (7)C++ template模板(重载)语法
      • (1)模板的定义
      • (2)模板的作用
      • (3)模板的形式
      • (4)函数模板
        • (1)函数模板的格式
        • (2)函数模板的示例
      • (5)类模板
        • (1)类模板的格式
        • (2)类模板的示例
        • (3)类模板创建对象方法
        • (4)在类模板外部定义成员函数的方法
      • 注意
  • 三、C++编程规范


前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!

本文先对C/C++语言语法应用踩过的坑做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章


提示:以下是本篇文章正文内容

一、C++内置库支持【库->API】 1.内置库和API函数的关系

【重要】每种语言(C/C++、python)都有它对应的语法、数据结构操作API和应用功能API函数,还有各种功能的库(功能包)

一些API的实现是用库支持的,而第一个库的实现也会用到第二种或者第三种库支持,这样就会出现各种依赖的问题

API函数的使用不在于记,因为API会随着版本更新而变化【防盗标记–盒子君hzj】
API的使用关键是在于找途径去查(翻墙Google)
.
.

2.std、STL库及其API函数 (1)【数据结构类】 (1)std::vector
1、std::vector的介绍
vector可以理解为动态数组,其特点和基本操作方式与array相似,但vector可以动态调整大小。
vector中的元素是连续存储的,这意味着我们不仅可以通过迭代器std::vector::iterator,还可以像array一样使用下标来访问任意位置的元素

2、vector支持的基本操作
1.vector的初始化及赋值
2.vector中插入元素
3. vector删除元素
4. vector查看容量与大小:size()函数是检查动态数组有多少个成员的数量的【防盗标记--盒子君hzj】
5. 自定义类的排序

参考
https://blog.csdn.net/qq_37653144/article/details/79242242
https://www.cnblogs.com/yxnchinahlj/archive/2011/03/06/1972435.html
https://blog.csdn.net/tpriwwq/article/details/80609371

(2)isnan()函数
snan() 判断是不是NAN值(not a number非法数字)
标准库中定义了一个宏:NAN来表示非法数字。比如负数开方、负数求对数、0.0/0.0、0.0* INFINITY(无穷大)、
INFINITY/INFINITY、INFINITY-INFINITY。注意:如果是整数0/0会产生操作异常
(3)isinf()函数
sinf()测试某个浮点数是否是无限大,其中INF表示无穷大

.
.
.

(2)【数据结构处理类】
(1).push_back()向列表等数据结构后面添加元素
(2)std_msgs::Float32是ROS中数据特有的,一般的C++就是用flaot代替
(3)用std的API ,cout,at,size等等
(3)【输入输出类】
(1)C语言:scan()/printf()

(2)C++语言:cint << XXX <
在cout或者cin出现错误的时候,可能是C++标准导致的,改成std::cout << XXX < 
(4)【算数运算类】 
(1)fabs() 

求绝对值的方法

(2)sqrt()

求平方运算

(3)Hypot(x,y,z)

欧式两点距离计算【防盗标记–盒子君hzj】

(4)norm()
norm()函数是C ++ STL中的内置函数,在头文件中定义。 norm()函数用于获取复数的范数。复数的范数是数字的平方大小
norm()函数是计算两点间的距离的平方,即向量的模平方

例子
【计算原点(0,0)到点(3,4)的距离】
K>> norm([3 4])
ans =25
(5)std::floor()和std:ceil()
std::floor 和 std::ceil都是对变量进行四舍五入,只不过四舍五入的方向不同
std::floor -->向下取整数【std::floor(5.88) = 5;】
std::ceil   -->向上取整数【std::ceil(5.88)   = 6;】
(6)dot()函数
向量或者是矩阵的点乘
设A(2 * 3), B(3 * 4), 那么dot(A, B)就表示两个矩阵相乘

.
.

(5)【文件读取类】
C++文件读取需要包含相关的std库
(1)Std::ifstream()

读取文件的整个内容

(2)Std::Isstringstream()

读取文件的第XXX行

(3)Std::getline()

读取文件某一行的所有元素【防盗标记–盒子君hzj】
.
.
.

二、C++的语法知识 (1)using与namespace的作用 (1)namespace作用
注意using和namespace的配合使用
namespace的用法可以使得程序更加清晰,模块引用不会乱
(2)using的作用
using的用法可以类似于宏定义,using可以配合namaspace做第三方库的命名空间宏

定命名空间是C++ using namespace中最常被用到的地方
【using namespace std;】

一般都是using Classbase::a;这样的形式出现
(它引用了基类Classbase中的成员a)

一般都是using a = b;这样的形式出现
(即a 是b的一个别名, a和b是同样的效果)【防盗标记--盒子君hzj】
(2)函数类型及返回 (1)尽量不要写void类型的函数
函数和线程如果带有数据类型不是void都要写return ,不然容易导致线程挂掉

尽量不要写void类型的函数,要写一个bool或者int类型的函数,至少函数出现问题可以用if(return)的方式查看,
或许函数或者线程挂了,逻辑根本排除不出来的
(2)函数形参传值和传址方法
1)在形参加入”&”的取地址符号,可以加快运行速度,因为传的是地址而不是变量
2)用引用的方式“&”和指针的方式“*”来传址,直接用变量的方式来传值

(3)在函数内传大数据结构体方法

1)在函数内传大数据结构体,在形参里面传,形参要用引用或者指针的形式
2)函数返回的数据量较大的时候,把变量放在形参中,return返回比较耗计算资源

.
.

(3)C++的数据类型 (1)NULL和nullptr数据类型
在C++中,NULL和nullptr不过也是0罢了,但是在使用的时候,建议你用nullptr而不是NULL
(2)const常量型变量
在定义变量的时候加上了const,该变量就不能被改变,认为该变量是一个常量,const可以出现在函数形参上(传实参但是不能被改变的场景),也可以用在全局定义变量上【防盗标记--盒子君hzj】

C++的const可以认为是C的define的升级版

如果对const常量型变量进行赋值,会左值数据类型报错
(3)vector的数据类型理解
vector是c++的向量数据类型,是数组的拓展,元素几乎什么都行
补全的时候,vector的数据类型都回出来的,怎么用看自己理解了或者百度

(1)赋值元素操作
vector数据类型的的赋值不能用等号,要用pull back,vector数据类型的相互赋值要用assign()

(2)增加元素操作
push_back()与emplace_back()函数,作用都是在容器后面加一个元素,实现不一样

(3)删除元素操作

(4)取元素操作
	.at()

......
(4)auto数据类型
auto是自动分配数据类型的意思,会根据右边赋值的量的数据类型来定义变量的数据类型【防盗标记--盒子君hzj】
(4)C/C++语法避坑 (1)判断语句语法 (a>b)?a:b
(0)条件语句的高级写法
(条件)?(行动一):(行动二)

(1)result=a>b?"x":"y";
判断a是否大于b,如果a大于b 则把x的值赋给result,如果a小于b 则把y的值赋给result

(2)result=a>b?"x":(a>c?"y":"z");
判断a是否大于b,如果a大于b 则把x的值赋给result,如果a小于b 那么在a大于b 的前提下进行判断a是否大于c,如果a大于c 那么把y的值赋给result,如果a小于c那么把z的值赋给result
(2)尽量不要在if、while(for)语句中定义变量,
在if、while(for)语句中定义变量,不会被编译的,但是可以在全局和函数局部中定义变量

.
.
.

(5)C++的操作符

“.”和“->”两个的作用有时候事一样的,但是“.”常用于成员操作,“->”常用于指针操作

1、A.B【.是成员调用操作符】

A为对象或者结构体,B为A中的成员变量或者成员函数
.

2、A->B【->是成员提取操作符】

A只能是指向类、结构、联合的指针,A->B是提取A中的成员B【防盗标记–盒子君hzj】
.

3、A::B【::是作用域运算符】

A可以是名字空间、类、结构,A::B表示作用域A(命名空间A)中的名称B
.

4、A:B【:是集成运算符】

A可以是类,A:B表示B类继承A类
.
.
.

(6)C++类的语法 (1)一个类中,类内的函数和变量可以相互调用 (2)一个类中,在.h类内进行声明不用加上类名
一个类中,在.h类内进行声明不用加上类名,但是函数在外面实现是记得加上类的名字,
函数格式一般是【函数类型+命名空间+类名称+函数名+参数】
引用任何的结构体和函数定义前前都要加上命名空间
(3)同一个类实例化不同的对象,对象是独立的
【若函数2要调用函数1,如果函数2也在类内声明了,函数2调用函数1的时候不需要用对象;
如果函数2没有在类内进行声明,函数2调用函数1的时候需要用对象;】
【函数1和函数2不在同一个类内才需要用对象去实例化】
(4)虚函数【工厂模式】
(1)纯虚类的继承必须override

(2)override的语法,当你写了override注解时
第一的作用:程序会判断你是否正确的重写了父类的对应方法。
第二的作用:只要子类定义了和父类一样的方法名,不管是直接重载还是override重写,那么父类中所有同名方法都会被子类屏蔽

(3)基类的虚函数一般不会写实现,在子类继承这个基类的时候必须对基类的虚函数进行重写
(5)类的单例Instance()
instance是实例的意思,在C++上的作用是把class实例化
Instance()函数是C++用来实例化一个类的,实例化的过程中就会运行类内的构造函数、init()函数、process()函数

.
.

(7)C++ template模板(重载)语法 (1)模板的定义
模板是用户为类或者函数声明一种一般模式,同样的函数和类的框架,但是允许输入输出类型不一样(类似于大型的重载函数)【防盗标记--盒子君hzj】
(2)模板的作用
使得函数中或类中的某些数据成员或者成员函数的参数、返回值可以取任意类型,让程序员编写与类型无关的代码

例子
比如编写了一个交换两个整型int 类型的swap函数,
这个函数就只能实现int 型,对double,字符这些类型无法实现,要实现这些类型的交换就要重新编写另一个swap函数。
使用模板的目的就是要让这程序的实现与类型无关,比如一个swap模板函数,即可以实现int 型,又可以实现double型的交换
(3)模板的形式
(1)函数模板(函数模板针对仅参数类型不同的函数)
(2)类模板(类模板针对仅数据成员和成员函数类型不同的类)
(4)函数模板 (1)函数模板的格式
template  返回类型 函数名(参数列表)【防盗标记--盒子君hzj】
{
    函数体
}
其中
(1)template和class是关键字,class可以用typename 关见字代替,在这里typename 和class没区别
(2)<>括号中的参数叫模板形参,模板形参不能为空
(3)<>括号后的是模板函数,模板函数的参数列表必须用模板形参定义
(2)函数模板的示例
template  void swap(T& a, T& b)
{}
当调用这样的模板函数时类型T就会被被调用时的类型所代替,
比如swap(a,b)其中a和b是int 型,这时模板函数swap中的形参T就会被int 所代替,
模板函数就变为swap(int &a, int &b)。而当swap(c,d)其中c和d是double类型时,
模板函数会被替换为swap(double &a, double &b),这样就实现了函数的实现与类型无关的代码

.
.

(5)类模板 (1)类模板的格式
template   class 类名
{ ... };
其中
(1)template和class是关键字,class可以用typename 关见字代替,在这里typename 和class没区别
(2)模板形参不能为空,一但声明了类模板就可以用类模板的形参名声明类中的成员变量和成员函数,
	 即可以在类中使用内置类型的地方都可以使用模板形参名来声明
(2)类模板的示例
template class A{public: T a; T b; T hy(T c, T &d);};
在类A中声明了两个类型为T的成员变量a和b,还声明了一个返回类型为T带两个参数类型为T的函数hy

.
.

(3)类模板创建对象方法
比如使用一个模板类A创建一个对象m,则使用类模板创建对象的方法为A m;在类A后面跟上一个<>尖括号并在里面填上相应的类型,
这样的话类A中凡是用到模板形参的地方都会被int 所代替。
当类模板有两个模板形参时创建对象的方法为A m;类型之间用逗号隔开【防盗标记--盒子君hzj】

.
.

(4)在类模板外部定义成员函数的方法
template<模板形参列表> 函数返回类型 类名<模板形参名>::函数名(参数列表){函数体}
如:
template void A::h(){}
注意

模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行【防盗标记–盒子君hzj】

.
.

三、C++编程规范

https://blog.csdn.net/Travis_X/article/details/87968746

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/458166.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号