C++
C++是一种静态数据类型语言,类型检查发生在编译时。
一个function的定义
- return type
- function name
- parameter list(允许为空)
- function body
int main()
{
printf(test())
return 0;
}
int test(int parameter){
parameter = parameter * 2;
return parameter;
}
- main函数的返回类型必须是int,在大多数系统中main的返回值被用来指示状态。返回0表明成功,非0的含义由系统定义,通常用来指出错误类型
- 头文件:要使用的库,一般将所有#include指令放在源文件开始位置
#include <iostream>
/*
简单主函数
读取两个数求它们的和
*/
int main()
{
std::cout << "Enter two numbers:" << std::endl;
int v1 = 0, v2 = 0;
std::cin >>v1 >> v2; //读取输入数据
std::cout << "The sum of " << v1 << " and " << v2
<< " is " << v1 + v2 << std::endl;
return 0;
}
'<<':输出运算符,接受两个运算对象,左侧必须是ostream对象,右侧是要打印的值
'>>':与输出运算符类似,接受一个istream作为其左侧运算对象,接受一个对象作为其右侧运算对象。从给定的istream读入数据并保存入给定对象中
endl:操作符,结束当前行,将与设备关联的缓冲区(buffer)中的内容刷到设备中。缓冲刷新操作保证到目前为止程序所产生的所有输出都真正写入输出流中,而不是只停留在内存中等待写入流
std:::指出名字cout和endl是定义在名为std的命名空间namespace中的。命名空间帮助避免不经意的名字定义冲突,以及使用库中相同名字导致的冲突。标准库定义的所有名字都在命名空间std中
通过命名空间使用标准库的副作用:当使用标准库的名字时,必须显式说明来自命名空间std中的名字。例如,需要写出std::,通过使用作用域运算符::来指出想使用定义在命名空间std中的名字cout
数据类型
基本内置类型
C++定义了一套包括算术类型(arithmetic type)和空类型在内的基本数据类型。
算术类型:
- 字符
- 整数型
- 布尔值
- 浮点数
除去布尔型和扩展字符型之外,其他整型可以划分为,带符号和无符号。带符号类型可以表示正数、负数或0。无符号仅能鄙视大于0的值。
类型int、short、long、和long long都是带符号的,通过在类型名前添加unsigned就可以得到无符号类型,类型unsigned int可以缩写为unsigned。
无符号整型和有符号整型的区别就是无符号类型可以存放的正数范围比有符号整型中的范围大一倍,因为有符号类型将最高位储存符号,而无符号类型全都储存数字。 比如16位系统中一个int能存储的数据的范围为-32768~327676而unsigned能存储的数据范围则是0~65535。
把负数转换成无符号数类似于直接给无符号数赋一个负值,结果等于这个负数加上无符号数的模。当从无符号数中减去一个值时,不管这个值时不是无符号数,都必须确保结果不能是负值。
转义序列
- 换行符:\n
- 纵向制表符:\v
- 反斜线:\ \
- 回车符: \r
- 横向制表符:\t
- 退格符:\b
- 问号:\ ?
- 进纸符:\f
- 报警符:\a
- 双引号:\ "
- 单引号:\ '
在程序中,上述转义序列被当作一个字符使用。也可以使用泛化转义序列,其形式为x后紧跟1个或多个十六进制数字,或者后紧跟1个、2个或3个八进制数字。例如0是空字符,115和x4d是字符M,40是空格
通过添加前缀后缀,可以改变整型、浮点型和字符型字面值当默认类型,例如
u8"hi!" //utf-8字符串字面值
L'a' //宽字符型字面值,类型是wchar_t
42ULL //无符号整型字面值,类型是unsigned long long
1E-3F //单精度浮点型字面值,类型是float
3.14159L //扩展精度浮点型字面值,类型是long double
布尔字面值和指针字面值
true和false是布尔类型的字面值;
nullptr是指针字面值
变量只能被定义一次,但可以被多次声明。若想声明变量而非定义它,就在变量名前添加关键字extern,且不显式地初始化变量。
extern int i; //声明i而非定义i
int j; //声明并定义j
标识符
- 自定义标识符中不能出现连续2个下划线,也不能下划线紧连大写字母开头
- 定义中函数体外的标识符不能以下划线开头
- 变量名一般用小写字母
- 自定义类名一般以大写字母开头,例如Sales_item
- 若标识符由多个单词组成,则单词间应有明显区分,例如student_loan或studentLoan
作用域
#include <iostream>
int reused = 42;
int main()
{
int unique = 0;
//输出#1:使用全局变量reused;输出 42 0
std::cout << reused << " " << unique << std::endl;
//新建局部变量reused,覆盖全局变量reused
int reused = 0;
//输出#2:使用局部变量reused;输出 0 0
std::cout << reused << " " << unique << std::endl;
//输出#3:显式地访问全局变量reused;输出 42 0
std::cout << ::reused << " " << unique << std::endl;
return 0;
}
引用
C++11中新增了右值引用(rvalue reference),这种引用主要用于内置类。严格来说,当我们使用术语引用时,指的其实是左值引用(lvalue reference)
引用:为对象起了另一个名字,引用类型引用另一种类型。通过将声明符写成&d的形式来定义引用类型,d是声明的变量名。
int ival = 1024;
int &refVal = ival; //refVal指向ival
int &refVal2; //报错:引用必须被初始化
refVal = 2 //把2赋给refVal指向的对象,即ival
int ii = refVal //与ii=ival执行结果相同
int &refVal3 = refVal //把refVal3绑定到了那个与refVal绑定的对象上,即ival
int i = refVal //i被初始化为ival的值
指针pointer
类
为了使用标准库,必须包含相关头文件。类似的,也需要使用头文件来访问自己的应用程序所定义的类。习惯上,头文件根据定义的类的名字来命名。通常使用.h作为头文件的后缀,标准库头文件通常不带后缀,编译器一般不关心头文件名的格式,但有的IDE对此有特殊要求
例子Sales/item
#include <iostream>
#include "Sales_item.h"
int main()
{
Sales_item book;
//读入书号、售出册数及销售价格
std::cin >> book;
//写入书号,售出册数、总销售额和平均价格
std::cout << book << std::endl;
return 0;
}
此程序以两个#include指令开始。包含来自标准库的头文件时,应该用< >包围头文件名。对于不属于标准库的头文件,则用" "包围。
在main中,定义了一个名为book的对象,用来保存从标准输入读出的数据。