学习一门编程语言,首先要熟悉它的类型系统。如果你连它存在哪些数据类型都不了解,还谈什么使用语言来编程呢。而且,大多数常用编程语言的类型基本是比较一致的。另外,一门编程语言,一般来说,是有一组保留的关键字,它们在程序中具有特殊的含义。我经过整理,把C++相关的数据类型及其部分保留关键字,及其基本修饰符,都列举出来。当然,这些在实际编程实践中,就会慢慢熟悉。
1、基本类型
C++语言中基本类型,如下表所示:
类型标识符 |
类型说明 |
长度 |
范围 |
备注 |
char | 字符型 | 1 | -128 ~ 127 | -27 ~ (27 -1) |
unsigned char | 无符字符型 | 1 | 0 ~ 255 | 0 ~ (28 -1) |
short int | 短整型 | 2 | -32768 ~ 32767 | 2-15 ~ (215 - 1) |
unsigned short int | 无符短整型 | 2 | 0 ~ 65535 | 0 ~ (216 - 1) |
int | 整型 | 4 | -2147483648 ~ 2147483647 | -231 ~ (231 - 1) |
unsigned int | 无符整型 | 4 | 0 ~ 4294967295 | 0 ~ (232-1) |
float | 实型(单精度) | 4 | 1.18*10-38 ~ 3.40*1038 | 7位有效位 |
double | 实型(双精度) | 8 | 2.23*10-308 ~ 1.79*10308 | 15位有效位 |
long double | 实型(长双精度) | 10 | 3.37*10-4932 ~ 1.18*104932 | 19位有效位 |
2、布尔类型
布尔类型使用关键字bool来声明布尔变量,它的取值为true和false。
3、枚举类型
枚举类型定义了一组整型常量(const int),使用enum关键字定义。这组常量具有一个名字,你可以命名为能够理解的常量名称,便于理解。而对于枚举类型的每个成员,都是一个int型的值,而且是按照定义的顺序以1递增,即初始的枚举成员可以指定初始值,之后的每个枚举成员都依次加1。
4、字符串类型
C++中具有两种定义字符串的风格,一个是来自C语言的char*指针类型,一个是C++的STL中的string类型。
5、指针类型
指针类型可以在任何非指针类型的基础上,得到对应类型的指针类型,其实指针就是一个内存的地址,表示一个内存地址单元的数字。
6、数组类型
对任何一种类型,都对应着该类型的数组类型,在函数的返回值是数组的时候,记得要返回数组的指针,也就是数组中第一个元素的内存地址。
7、引用类型
引用类型是C++中特有的一种数据类型,它可以是某个对象的别名,通过这个别名就能够引用到对象,从而间接地操作这个对象。
在定义引用类型的时候,必须知道所要引用的对象的类型和该对象确实真实地存在,这样我们才能够去引用它从而操作它。
引用类型,可以是任意类型加上取地址符号&,就构成了引用类型。
8、类类型
类类型一般包括类的声明和类的定义。类的声明,是指告诉编译器,某个类型已经存在;而类的定义,就是一个类在运行时应该表现出来的行为。C++提供的标准类库STL,提供了大量有用的类供我们使用。在实际开发中,我们还可以根据实际情况,定义我们自己需要的类类型。
下面,通过编写一个例子,对上面C++的类型有个基本的了解。代码如下所示:
#include <iostream> #include <string> using namespace std; class person; void test_bool(); void test_enum(); void test_reference(); void test_pointer(); void test_class(); int main() { test_bool(); cout<<endl; test_enum(); cout<<endl; test_reference(); cout<<endl; test_pointer(); cout<<endl; test_class(); return 0; } void test_bool() { bool is_good = true; cout<<"is_good="<<is_good<<endl; } enum week { SUN=100, MON, TUS, WED, THU, FRI, STA }; void test_enum() { week week_day = STA; cout<<"week_day="<<week_day<<endl; } void test_reference() { float price = 12.56; float& ref_price = price; cout<<"Before modifying reference:"<<endl; cout<<"price="<<price<<endl; cout<<"ref_price="<<ref_price<<endl; ref_price += 78.35; cout<<"After modifying reference:"<<endl; cout<<"price="<<price<<endl; cout<<"ref_price="<<ref_price<<endl; } void test_pointer() { int *ptr = NULL; int counter = 100; ptr = &counter; cout<<"Before *ptr++, counter="<<counter<<", *ptr="<<*ptr<<endl; *ptr++; cout<<"After *ptr++, counter="<<counter<<", *ptr="<<*ptr<<endl; ptr = &counter; cout<<"Before (*ptr)++, counter="<<counter<<", *ptr="<<*ptr<<endl; (*ptr)++; cout<<"After (*ptr)++, counter="<<counter<<", *ptr="<<*ptr<<endl; } class person { public: person(string& name, int age):name(name), age(age) { } string& get_name() { return name; } int get_age() { return age; } private: string &name; int age; }; void test_class() { string name("James Halt"); int age = 24; person *james = new person(name, age); cout<<"person->name="<<james->get_name()<<endl; cout<<"person->age="<<james->get_age()<<endl; delete james; }
编译运行:
[hadoop@localhost c++]$ g++ -Wall -o mynote01 mynote01.cpp [hadoop@localhost c++]$ ./mynote01
运行结果,输出如下所示:
is_good=1 week_day=106 Before modifying reference: price=12.56 ref_price=12.56 After modifying reference: price=90.91 ref_price=90.91 Before *ptr++, counter=100, *ptr=100 After *ptr++, counter=100, *ptr=-1076961796 Before (*ptr)++, counter=100, *ptr=100 After (*ptr)++, counter=101, *ptr=101 person->name=James Halt person->age=24
通过上面程序运行结果,可以看到:
(1)布尔类型中,true实际等于1,false等于0;
(2)枚举类型,可以指定初始值,然后每个枚举成员依次递增1;
(3)引用类型,可以通过引用来修改引用类型变量所引用的变量值;
(4)通过指针可以修改指针指向的变量的值。
C++保留的关键字,如下所示:
asm |
auto |
bad_cast |
bad_typeid |
bool |
break |
case |
catch |
char |
class |
const |
const_cast |
continue |
default |
delete |
do |
double |
dynamic_cast |
else |
enum |
except |
explicit |
extern |
false |
finally |
float |
for |
friend |
goto |
if |
inline |
int |
long |
mutable |
namespace |
new |
operator |
private |
protected |
public |
register |
reinterpret_cast |
return |
short |
signed |
sizeof |
static |
static_cast |
struct |
switch |
template |
this |
throw |
true |
try |
type_info |
typedef |
typeid |
typename |
union |
unsigned |
using |
virtual |
void |
volatile |
while |
简单介绍几个:
1、const修饰符
const是常量修饰符,可以修饰任何基本类型,表示该类型的常量,在计算过程中常量的值是不可以改变的。
2、volatile修饰符
volatile修饰符也可以修饰任何基本类型,通常是为了告诉所使用的编译器,可能在编译器控制或者监测环境之外发生改变。
3、typedef关键字
用于重新定义一个类型的,通常将已经存在的类型重新定义为具有含义的类型标识符。
4、template关键字
C++定义模板的时候,使用template关键来定义。
5、using与namespace关键字
定义或者声明命名空间的时候使用using namespace关键字。
6、inline关键字
在生命内联函数的时候使用inline关键字。inline 内联函数给出了一种解决方案:若一个函数被指定为inline 函数则它将在程序中每个调用点上被内联地展开。inline 机制用来优化小的只有几行的经常被调用的函数。
7、new与delete关键字
在堆上创建对象,也就是与整个应用程序的声明周期相同,除非显式地使用delete关键字释放堆上分配的内存,而且必须显式地使用delete来回收,否则会造成内存泄露。
8、operator关键字
操作符重载,使用operator关键字来重载定义。
9、typename关键字
typename是用来定义泛型,声明模板的类型的。
我们直接来看这些保留关键字,可能感觉非常枯燥,而且几乎不可能真正理解它们到底是做什么用的。那么,只有通过多多实践,来逐渐地了解并熟悉C++语言的特性,这应该是一种巩固C++编程基础的合理途径。
在Linux系统下,知道如何编译和运行C++程序,这是最基础的。在Linux下使用vim编辑器,例如,要在mycpp01.cpp文件中输入C++源代码,可以直接使用vim编辑器:
vi mynote01.cpp然后,编写C++程序。编写完成后,保存源文件,然后进行编译:
g++ -Wall -o mynote01 mynote01.cpp这时,如果存在警告或者错误信息,就会打印出来,便于定位问题并进行修正。如果程序没有问题,则会生成可执行文件mynote01,能够运行你编写的程序。运行C++程序,执行如下命令:
./mynote01
这样,就能够按照我们编写的C++程序的逻辑去执行。