C++学习笔记(一)

学习一门编程语言,首先要熟悉它的类型系统。如果你连它存在哪些数据类型都不了解,还谈什么使用语言来编程呢。而且,大多数常用编程语言的类型基本是比较一致的。另外,一门编程语言,一般来说,是有一组保留的关键字,它们在程序中具有特殊的含义。我经过整理,把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++保留关键字

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++编程基础的合理途径。

第三部分:编译运行C++程序

在Linux系统下,知道如何编译和运行C++程序,这是最基础的。在Linux下使用vim编辑器,例如,要在mycpp01.cpp文件中输入C++源代码,可以直接使用vim编辑器:

vi mynote01.cpp
然后,编写C++程序。编写完成后,保存源文件,然后进行编译:

g++ -Wall -o mynote01 mynote01.cpp
这时,如果存在警告或者错误信息,就会打印出来,便于定位问题并进行修正。如果程序没有问题,则会生成可执行文件mynote01,能够运行你编写的程序。运行C++程序,执行如下命令:

./mynote01

这样,就能够按照我们编写的C++程序的逻辑去执行。

你可能感兴趣的:(C++学习笔记(一))