下列语句定义了5个变量:
int count;
double sales_price,sum;
std::string title;
Sales_item bookItem;
每个定义都是以类型说明符开始,如上int、double、std::string、Sales_item都是类型名,其中int和doubleshi是内置类型,std::string是标准库定义的类型(需要#include <string>), Sales_item是自定义类型。
::作用域操作符,含义是右操作符的名字可以在左操作数的作用域中找到
简化std::string 的写法是使用using.
比如使用using std::string; using std:cin;之后,在下面的代码中就可以直接使用string和cin了。
当进行string对象和字符串字面量混合连接操作时,+操作符的左右操作数必须至少有一个是string类型的。
比如,如下s1的初始化时正确的
string item ="what a mess!";
string s1 =item +",";
但是:string s1 ="what a mess!" +",";
就会报错,这个和C#是完全不一样的。
虽然任何整数数值都可以作为索引,但是索引的实际数据类型却是unsigned类型的string::size_type
vector
vector是一个类模版(class template),是同一种类型的对象的集合,每个对象都有一个对应的整数索引值,功效上可以参考C#的IList<T>.例如:
vector<int> int_list;
vector的初始化有如下几种方式:
vector<T> v1;//vector保存类型为T对象,默认构造函数v1为空
vector<T> v2(v1);//v2是v1的一个副本
vector<T> v3(n,i);//v3包含n个值为i的元素
vector<T> v4(n);//v4含有值初始化元素的n个副本
往队尾插入元素的函数是push_back
迭代器:
每种容器类型都定义了一个自己的迭代器,比如:
vector<int>::iterator iter;
每种容器都定义了begin和end函数;
比如可以这样写:
vector<int> int_list(5,10);//初始化为5个10
vector<int>::iterator iter=int_list.begin();// 迭代器
将每一个迭代引用的元素设置为0:
for (vector<int>::iterator i =int_list.begin();i!=int_list.end();i++)
{
*i=0;
}
另外,所有的容器也还定义了另外一个迭代器,const_iterator,和iterator的区别是前者不可以修改容器元素的值。
vector<int>::const_iterator
不允许用const_iterator进行赋值操作。
任何改变vector长度的操作都会使已经存在的迭代器失效。比如调用push_back之后,就不能再信赖vector的迭代器的值了
数组:
数组的维数必须用大于等于1的整数常量表达式定义,这个常量表达式只能是整形字面常量、枚举常量、或者常量表达式初始化的整型const对象。非const变量以及要到运行阶段才知道其值的const变量都不能用于定义数组的维数。
int main()
{
int getNumber();
const int max_files=30;
const int otherNumber =getNumber();
std::cout《otherNumber《std::endl;
int staff_size=30;
char input_buffer1[11];
char input_buffer2[max_files];
//char input_buffer3[staff_size];//错误,staff_size是局部变量
//char input_buffer4[otherNumber];//错误,otherNumber是运行阶段才知道其值的const变量
Console::WriteLine(L"Hello World");
Console::ReadLine();
return 0;
}
int getNumber()
{
return 2;
}
字符数组比较特殊,如下
char ca1[] = {'C', '+', '+'}; // 缺少 null
char ca2[] = {'C', '+', '+', '\0'}; // 明确带上 null
char ca3[] = "C++"; // 自动添加上null
ca1 的维数是 3,而 ca2 和 ca3 的维数则是 4.
另外,不允许数组直接复制和赋值。需要注意的是,一些编译器允许将数组赋值作为编译器扩展。但是如果希望编写的程序能在不同的编译器上运行,则应该避免使用像数组赋值这类依赖于编译器的非标准功能。
与 vector 类型不同,数组不提供 push_back 或者其他的操作在数组中添加新元素,数组一经定义,就不允许再添加新元素。
在用下标访问元素时,vector 使用 vector::size_type 作为下标的类型,而数组下标的正确类型则是 size_t.
指针
与迭代器一样,指针提供对其所指对象的间接访问,只是指针结构更通用一些。与迭代器不同的是,指针用于指向单个对象,而迭代器只能用于访问容器内的元素。
在定义指针变量时,可用空格将符号 * 与其后的标识符分隔开来。如下三个写法都是正确的:
std::string* sp =&s;
std::string *sp =&s;
std::string*sp =&s;
而std::string* sp1,sp2;这句实质上定义了sp1这一个指针,而sp2则是普通的string变量。
很多运行时错误都源于使用了没有初始化的指针。
如果必须分开定义指针和其所指向的对象,则将指针初始化为 0.因为编译器可检测出 0 值的指针,程序可判断该指针并未指向一个对象。
说明:
指针中的*操作符的含义是对指针进行解引用获得该指针所指向的对象。解引用操作符返回左值,因此可为其结果赋值,等效于为该指针所指向的特定对象赋值。
&操作符则是返回操作数对象在内存中的存储地址,不可赋值。