记录一些C++的语法方便日后查看。

1.C++初始化语法

C++中新增加了两种初始化语法,其中大括号初始化器需要C++11以上的实现,使用时可以加等号,也可以不加,而且大括号中可以不包含任何东西,这种情况下变量被初始化为0。

    int x();
int y = { };
int z{ };
int w{};//set w to 0

2.sizeof运算符和climits头文件

C++的数据类型的长度在不同系统和实现中可能有所区别,比如int类型通常为32位,但在某些系统中int为16位,通过sizeof运算符和climits头文件中的符号常量可以得到系统中各数据类型的长度和该类型能存储的最大与最小值。

sizeof可对类型名和变量名使用,对类型名使用时应将名称放在括号中,对变量名使用则不需要。

    int n;
//sizeof
cout << sizeof(int) << endl;
cout << sizeof n << endl;
//climits
cout << INT_MAX << endl;// output max of int
cout << LLONG_MIN << endl;
cout << USHRT_MAX << endl;

3.cout控制输出格式

输出不同进制:

    int n = ;
cout << dec << n;//十进制
cout << oct << n;//八进制
cout << hex << n;//十六进制

控制输出位数和小数位数(需引入iomanip头文件)

    double n = 243.56298;
cout << setprecision() << n;//保留5位有效数字
cout << fixed << setprecision() << n;//保留小数点后2位

4.原始字符串

原始字符串中,字符表示的就是自己,忽略转义序列和单双引号的意义,将其作为字符串一部分,原始字符串以R为前缀,将"(和")作为界符。

如果需要在字符串中包含"(或)",可以在界符的双引号和括号间加入任意字符作为标记,这样结尾也必须加入这些字符。

    cout << R"(asdfsd\''"\t\nsds)" << endl;
cout << R"abc(sdasd")asds)abc" << endl;

5.结构位字段和共用体

C++可以指定使用特定位数存储的结构成员,还可以使用没有名称的字段提供间距。

struct Stu
{
int id : ;//4 bits for id
int : ;//4 bits unused
char sex : ;
};

共用体可以存储不同的数据类型,但同时只能存储其中一种,共用体的长度为其最大成员的长度。

union val
{
int IntVal;
double DoubleVal;
long LongVal;
};

使用时在不同时间使用不同变量即可,共用体的好处是当数据项使用多种类型表示时,可以节省内存,用同一块内存存储不同类型变量。

    val v;
v.IntVal = ;//store int
cout << v.IntVal;
v.DoubleVal = 34.55;//store double
cout << v.DoubleVal;

可以把结构体和共用体结合使用,如果有一个结构成员需要使用不同的类型,可以在结构中使用匿名共用体。

访问时使用stu.id_num或stu.id_char即可。

struct Stu
{
string name;
char sex;
union //anonymous union
{
int id_num;
char id_char[];
};
};

6.Delete释放内存

    int* pt = new int;
int* ps = new int[];
delete pt;
delete[] ps;

(1)不要用delete释放不是new分配的内存

(2)不要用delete释放同一内存块2次

(3)如果用new为一个实体分配内存,使用delete释放,如果用new[ ]为数组分配内存,用delete[ ]释放。

(4)对空指针使用delete是安全的。

7.计时

使用头文件ctime实现计时,clock函数返回程序开始执行后所用的系统时间单位数,类型为clock_t,CLOCKS_PER_SEC常量表示每秒钟包含的系统单位时间数,将系统时间除以这个值即为秒数,将秒数乘以这个值,即为对应的系统单位时间数。据此可以编写如下指定时间的延时程序。

    float second;
cin >> second;
clock_t Delay = second * CLOCKS_PER_SEC;//Get Clock Ticks To Delay
clock_t Start = clock();
while (clock() - Start < Delay);//Delay Loop
cout << "end" << endl;

8.cctype头文件

cctype头文件中有很多用于判断字符类型的函数

isalnum()  如果参数是字母数字,即字母或者数字,函数返回true

isalpha()  如果参数是字母,函数返回true

iscntrl()  如果参数是控制字符,函数返回true

isdigit()  如果参数是数字(0-9),函数返回true

isgraph()  如果参数是除空格之外的打印字符,函数返回true

islower()  如果参数是小写字母,函数返回true

isprint()  如果参数是打印字符(包括空格),函数返回true

ispunct()  如果参数是标点符号,函数返回true

isspace()  如果参数是标准空白字符,如空格、换行符、水平或垂直制表符,函数返回true

isupper()  如果参数是大写字母,函数返回true

isxdigit() 如果参数是十六进制数字,即0-9、a-f、A-F,函数返回true

tolower()  如果参数是大写字符,返回其小写,否则返回该参数

toupper()  如果参数是小写字符,返回其大写,否则返回该参数

9.输入类型不匹配时怎么办

    int n;
cin >> n;

如果程序接收一个整型输入,但用户输入了一个字符,会发生什么呢?

(1)n的值不变。

(2)不匹配的输入留在输入队列中。

(3)cin对象中的错误标记被设置

(4)对cin的调用返回false(被转为bool类型时)

当出现这种情况时,需要使用cin.clear()重置错误标记并清空错误输入,然后才能让用户重新输入。

    while (!(cin >> n))
{
cin.clear();//reset input
while (cin.get() != '\n')continue;//get bad input
cout << "Please Enter a number:";
}

10.简单文件IO

需包含头文件fstream

    ofstream fout;
fout.open("test.txt");//open file
if (!fout.is_open())//Check Open
{
exit(EXIT_FAILURE);
}
fout << << endl;//write 12 to file
fout.close();//close file ifstream fin;
fin.open("test.txt");
int n;
fin >> n;//read a int to n
fin.close();

要循环读取文件可以使用good()函数判断读取状态

    int n;
fin >> n;
while (fin.good())
{
fin >> n;
}

11.函数指针

若目标函数原型为:const double* f1(const double a[], int n);  则要创建指向该函数的指针,只需将函数名替换为(*pa),使用auto可以更简单地创建,之后可以使用指针调用函数。

    const double* (*p1)(const double*, int) = f1;
auto p2 = f1;
cout << *p1(a, ) << endl;
cout << *p2(a, ) << endl;

要创建一个包含三个函数指针的数组如下:

const double* (*pa[])(const double*, int) = {f1,f2,f3};

12.函数模板

template<typename Any>//You can Use Class instead of typename
void Swap(Any& a, Any& b)
{
Any temp;
temp = a;
a = b;
b = temp;
}

可以针对某个类型提供具体的函数定义——称为显式具体化,编译器将使用该定义而不再寻找模板。

template<> void Swap<int>(int& a, int& b)//<int> can be ignored
{
cout << "This is Int Swap";
}

在编写模板函数时,有时并不知道在声明中应使用哪种类型,可以使用decltype关键字声明和括号内表达式相同类型的变量。

template<class T1,class T2>
void fun(T1 x,T2 y)
{
decltype(x + y) sum = x + y;//The type of sum is same as x+y
}

但如果返回值是x+y类型怎么办呢,由于确定返回值时未声明x和y,所以无法使用decltype解决,C++新增了使用auto用于函数定义的方法,可将返回类型移到参数声明后面,称为后置返回类型。

auto fun1(int x, float y)->double;

通过这种语法结合decltype,就可以解决返回值类型未知的问题:

template<class T1,class T2>
auto fun(T1 x,T2 y)->decltype(x+y)
{
decltype(x + y) sum = x + y;
return sum;
}

13.全局作用域解析符

int a = ;
int main()
{
int a = ;
cout << a << endl;//输出局部变量a
cout << ::a << endl;//输出全局变量a
return ;
}

在变量前加上作用域解析符"::"使用该变量的全局版本。

14.右值引用

    int&& d = ;
cout << d;

使用&&可创建对右值的引用。

15.判断两个对象是否为同种类型

    ClassA a;
ClassB b;
cout<<(typeid(a) == typeid(b));

使用typeid运算符,可传入对象或类名。

C++语法备忘的更多相关文章

  1. 项目中oracle存储过程记录——经常使用语法备忘

    项目中oracle存储过程记录--经常使用语法备忘 项目中须要写一个oracle存储过程,需求是收集一个复杂查询的内容(涉及到多张表),然后把符合条件的记录插入到目标表中.当中原表之中的一个的日期字段 ...

  2. shell基本语法备忘

    1.第一行要写明shell种类 #!/bin/bash   2.打印输出 #!/bin/bashecho "Hello World !~"   3.变量定义 变量=前后不能有空格, ...

  3. SASS语法备忘

    sass语法 关于sass 3.3.0更新说明——3.3.0 sublime相关插件为:scss语法高亮,sass语法高亮,编译,保存即编译,格式化 文件后缀名 sass有两种后缀名文件:一种后缀名为 ...

  4. Markdown语法备忘

    标题 标题 标题是每篇文章都需要也是最常用的格式,在 Markdown 中,如果一段文字被定义为标题,只要在这段文字前加 # 号即可. # 一级标题 ## 二级标题 ### 三级标题 以此类推,总共六 ...

  5. LESS语法备忘

    变量 很容易理解: @nice-blue: #5B83AD; @light-blue: @nice-blue + #111; #header { color: @light-blue; } 输出: # ...

  6. markdown 语法备忘

    markdwon语法, 增加以下CSS代码,可以对markdwon语法产生的文件进行分页操作. <div style="page-break-after:always;"&g ...

  7. [学习笔记] Markdown语法备忘

    Markdown语法总结 标题 # 这是一级标题 ## 这是二级标题 ### 这是三级标题 #### 这是四级标题 ##### 这是五级标题 ###### 这是六级标题 注意#后面要加空格 字体 ** ...

  8. PowerShell 语法备忘

    1.挡可能出现 .0 的时候需要加上引号 2.使用 -Join 或者 + 进行字符串拼接 3.在cmd 命令下可以使用 set /a  s=1+2  表示需要进行计算,而不是拼接

  9. SQL基本语法备忘

    注:以下演示是在mysql命令行下的操作 数据库相关操作 create database mytest; --创建数据库 create database if not exists mytest; - ...

随机推荐

  1. 如何使用 AWS Auto Scaling 按需动态增加和减少实例

    目录 一.背景需求 二.配置步骤 2.1.创建 AMI 2.2.创建负载均衡目标组 2.3.创建 Classic Load Balancer 2.4.创建启动配置 2.5.创建 Auto Scalin ...

  2. Exploit completed, but no session was created.

    在kali上做metasploit实验,步骤如下: msf5 exploit(windows/mssql/mssql_payload) > show options Module options ...

  3. IBM.WMQ订阅消息

    网上关于IBM这个消息队列中间件的资料相对比较少,C#相关的资料就更少了,最近因为要对接这个队列中间件,花了不少功夫去搜索.整理各种资料,遇到很多问题,因此记录下来. 1.基于 amqmdnet.dl ...

  4. 最新 海看java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.海看等10家互联网公司的校招Offer,因为某些自身原因最终选择了海看.6.7月主要是做系统复习.项目复盘.LeetCode ...

  5. mac 已损坏 移至废纸篓

    1.问题描述: 从网页下载的安装包,总是提示“已损坏,移至废纸篓”这类的信息 2.原因: 系统版本过高,对安全性进行了校验. 3.解决方案:命令行输入以下命令,然后输入密码 sudo spctl -- ...

  6. Z1. 广度优先搜索(BFS)解题思路

    /** BFS 解题思路 特点:从某些特定的节点开始,感染相邻的节点; 被感染的节点,再感染其相邻的节点,以此类推. 题目常见于数据结构包括 二维数组.树.图 **/ /** 1). 二维数组特定节点 ...

  7. [转帖]Linux 中的零拷贝技术,第 1 部分

    Linux 中的零拷贝技术,第 1 部分 https://www.ibm.com/developerworks/cn/linux/l-cn-zerocopy1/index.html   引言 传统的 ...

  8. 【51nod】1776 路径计数

    [51nod]1776 路径计数 我们先把前两种数给排好,排好之后会有\(a + b + 1\)个空隙可以填数,我们计算有\(k\)个空隙两端都是相同字母的方案数 可以用枚举把第二种数分成几段插进去来 ...

  9. javaIO -- InputStream和OutStream

    一.简介 InputStream 和 OutputStream 对于字节流的输入和输出是作为协议的存在 所以有必要了解下这两个类提供出来的基本约定,这两个类是抽象类,而且基本上没什么实现,都是依赖于子 ...

  10. 《统计学习方法》极简笔记P4:朴素贝叶斯公式推导

    <统计学习方法>极简笔记P4:朴素贝叶斯公式推导 朴素贝叶斯基本方法 通过训练数据集 T={(x_1,y_1),(x_2,y_2),(x_N,y_N)...,(x_1,y_1)} 学习联合 ...