C++primer中文版笔记--第二篇 C++数据类型

第二篇
基本语言 C++数据类型

1.       字节(byte8位和字(word32位——〉64位发展,依赖于机器(machine-dependent

2.       类型抽象使我们能够对一个定长的位序列进行有意义的解释。

3.       字符型char 通常用来表示单个字符和小整数,它可以用一个机器字节来表示
int
(一个机器字)short(半个机器字)long(一个或两个机器字)
float
(一个字)double(两个字)long double(三个或四个字)

4.       文字常量是不可寻址的(nonaddressable
8
进制0前缀;16进制0x0X
文字常量后加Ll,表long;加Uu,表无符号数——fFlL这四个后缀只用于十进制中

转义序列以反斜扛开头/
字符文字前加L,表宽字符文字,类型为wchar_t,用于支持如汉语日语这些语言的字符集合。如
L’a’
字符串文字可以扩展到多行,在一行的最后加上一个反斜杠,表明字符串文字在下一行继续。前加L,表常量宽字符的数组。

没有任何修饰的3.14double型, 3.14f 单精度浮点型, 3.14L 多精度浮点型

5.       变量:提供一个有名字的内存存储区,可以通过程序对其进行读、写和处理。
可寻址,有两个值与它关联
1
)它的数据值,存储在某个内存地址中,对象的右值(rvalue),即被读取的值
2
)它的地址值,存储数据值的那块内存的地址,变量的左值(lvalue),即位置值
变量的定义会引起相关内存的分配,一个对象只有一个位置,所以只能被定义一次,可以通过声明来使其他程序知道该对象的存在。
对象声明的作用是使程序知道该对象的类型和名字,由关键字extern及跟在后面的对象类型以及对象的名字构成。声明不是定义,不会引起内存分配。
C++
关键字

6.       变量的两种初始化
1
)显式是用赋值操作符
2
)用括号。如 string project ( “Fantasia 2000” );

7.       指针的典型用法是构建一个链接的数据结构,例如树和链表,并管理在程序执行过程中动态分配的对象,以及作为函数参数类型,主要用来传递数组或大型的类对象。

8.       当指针持有0值时,表明它没有指向任何对象,或持有一个同类型的数据对象的地址。
int *pi = 0;//pi
被初始化为没有指向任何对象
指针不能持有非地址值
指针不能被初始化或赋值为其他类型对象的地址值

9.       空(void *)类型指针,它可以被任何数据指针类型的地址值赋值(函数指针不行),不能操作空类型指针所指向的对象,只能传送该地址值或将它与其他地址值作比较。

10.   指针的算术运算(pointer arithmetic)。指针加2意味着给指针持有的地址值增加了该类型两个对象的长度。

11.   某些指针的使用准则:总是将指针初始化,不要无视编译器发出的错误信息或警告信息如“强制转换为指针变量(explicit casts to pointer variables)”等等

12.   string类型能够自动将C风格的字符串转换成string对象
string s1;
const char *pc = “a character array”;
s1 = pc;
但是反向的转换不能自动执行。
begin
()和end()操作返回指向string开始和结束处的迭代器(iterator,是指针的类抽象)
p82

13.   const类型限定修饰符,能把一个对象转换成一个常量,在程序中任何改变这个值的企图都将导致编译错误,因为它被称为是只读的(read-only

14.   const double *cptr;
//cptr
是一个指向double类型的const对象的指针(从右向左读“cptr是一个指向

//double
类型的、被定义成const的对象的指针”)
//
其中微妙在于cptr本身不是常量,我们可以重新赋值cptr,使其指向不同对象
//
但不能修改cptr指向的对象。
//const
对象的地址只能赋值给指向const对象的指针,但指向const对象的指针可以被
//
赋以一个非const对象的地址。

15.   在实际程序中,指向const的指针常被用作函数的形式参数,它作为一个约定来保证:被传递给函数的实际对象在函数中不会被修改。
int strcmp( const char *str1, const char *str2 );

16.   int errNumb = 0;
int *const curErr = &errNumb;
curErr
是指向一个非const对象的const指针。(curErr是一个指向int类型对象的const指针)。这意味着不能赋给curErr其他的地址值,但可以修改curErr指向的值。

17.   const double pi = 3.14159;
const double *const pi_ptr = π
指向const对象的const指针。pi_ptr指向的对象的值以及它的地址本身都不能改变。(pi_ptr是指向被定义为constdouble类型对象的const指针)

18.   引用(reference)有时候又称为别名(alias),它可以用作对象的另一个名字。通过引用可以间接地操纵对象,使用方式类似于指针,但不需要指针的语法。实际应用中,引用主要被用作函数的形式参数——通常将类对象传递给一个函数。
引用必须被初始化
int ival = 1024;
int &refval = ival;

19.   指针引用
int &refVal1 = &ival;//
错误,refVal1int类型,不是int*
int *pi = &ival;
int *&refPtr = pi;//
正确,refPtr是一个指向指针的引用,即int*

20.   引用的所有操作实际上都是应用在它所指的对象身上,包括取地址操作符。
int *pi = &refVal;//
refVal引用的变量ival的地址初始化pi

21.   const引用可以用不同类型的对象初始化(只要能从一种类型转换到另一种类型即可),也可以是不可寻址的值,如文字常量。
double dval = 3.14159;
//
下面仅对于const引用才合法
const int &ir = 1024;
const int &ir2 = dval;
const double &dr = dval +10;

22.   引用必须总是指向一个对象,如果用一个引用给另一个引用赋值,那么改变的是被引用的对象而不是引用本身。
但是指针可以不指向任何对象,如int *pi = 0;//pi不指向任何对象。

23.   引用类型主要被用作函数的形式参数
bool get_next_value( int &next_value );//
返回访问状态,将值放入参数。
Matrix operator+( const Matrix&, const Matrix& );//
重载加法操作符
int ival;
while ( get_netx_value( ival ))…
//
实际参数ival同形式参数next_value的绑定,等价于下面的独立对象的定义
//int &next_value = ival;

24.   布尔型对象可以被赋以文字值turefalse,虽然也被看作是一种整数类型的对象,但是它不能被声明为signedunsignedshortlong
当表达式需要一个算术值时,布尔对象和布尔文字都被隐式地提升成intfalse0true1
如果有必要,算术值和指针值也能隐式地被转换成布尔类型的值,0或空指针被转换成false,所有其他值都被转换成true
//
返回出现次数
extern int find( const string& );
bool found = false;
if ( found = find( “rosebud” ))
   //OK: found == true

//
如找到返回该项的指针
extern int* find( int value );
if ( found = find( int value );
    //ok: found == true

25.   枚举(enumeration)不但能定义整数常量,而且还能把它们组合成一个集合。
枚举成员(enumerator),代表了能用来初始化和赋值枚举类型变量的值的全集。
如果试图传递一个非枚举成员之外的值,就会产生编译错误。
可以定义枚举类型对象,它可以参与表达式运算,也可以被作为参数传递给函数。
不能打印枚举成员的实际枚举名,可以定义一个由枚举成员的值索引的字符串数组
不能使用枚举成员进行迭代。

26.   数组类型,是一个单一数据类型对象的集合。可以通过索引访问indexing(或下标访问subscripting),即通过它在数组中的位置对它进行访问。
数组定义由类型名、标识符和维数组成。维数必须是常量表达式,即必须能在编译时刻计算出它的值。即意味着非const的变量不能被用来指定数组的维数。

27.   字符数组可以用一个由逗号分开的字符文字列表初始化,花括号括起来,或者用字符串常量初始化。但两者不同,字符串常量包含一个额外的终止空字符。

28.   一个数组不能被另外一个数组初始化,也不能赋值给另外一个数组,而且C++不允许声明一个引用数组(即由引用组成的数组)
const int array_size = 3;
int ix, jx, kx;
int *iap[] = {&ix, &jk, &kx};//OK:
类型为int *的指针数组
int &iar[] ={ix,jx,kx};//
错误,不允许引用数组

29.   任意结果为整数值的表达式都可以用来索引数组

30.   多维数组,行(row),列(column
ia[ ][ ]
ia[1
2]等价于ia[2](逗号表达式,值为2);等价于访问ia的第三行的第一个元素。与ia[1][2]不同。

31.   数组标识符代表数组中第一个元素的地址,它的类型是数组元素类型的指针,即int*

32.   泛型程序设计(generic programming,使用模板函数。下面举例说明
#include <iostream>
template <class elemType>
void print(elemType *pbegin, elemType *pend)
{
    while
pbegin != pend
    {
        cout << *pbegin << ‘ ‘;
        ++pbegin;
    }
}
int main()
{
    int ia[9]={0,1,2,3,4,5,6,7,8};
    double da[4]={3.17,6.28,12.56,25.12};

    print(ia,ia+9);
    print(da,da+4);
}

33.   vector类为内置数组提供了一种替代表示。包含#include <vector>
数组习惯使用:vector<int> ivec(10);//定义了10int型的
vector
STL
习惯使用:vector<int> text;//此时text是一个空的
vector
我们向vector中插入元素,而不再是索引元素,以及向元素赋值。如push_back()操作就是在vector的后面插入一个元素。使用begin()end()所返回的迭代器(iterator)对。

任何一个插入操作(push_back)都将增加vector的大小,而不是覆盖掉某个现有的元素。
vector<int>::iterator it = text.begin();
iterator
是标准库中的类,具有指针功能。
*it
//对迭代器解引用,并访问其指向的实际对象。
++it
//向前移动迭代器it,使其指向下一个元素。

34.   复数(complex number)类。 #include<complex>
complex<double> purej(0,7);//0+7i

35.   typedef机制提供一种通用的类型定义,可以用来为内置的或用户定义的数据类型引入助记符号。
typedef vector<int> vec_int;

typedef char *cstringl
extern const cstring cstr;
//
该定义声明了一个指向字符的const指针,即 char *const cstr;
//const char *cstr;//
即指向const字符的指针。

36.   volatile限定修饰符。当一个对象的值可能会在编译器的控制或监测之外被改变时,例如一个被系统时钟更新的变量,则应该声明成volatile。因此,编译器的某些例行优化行为不能应用在已指定为volatile的对象上。
volatile Task *curr_task;//curr_task
是一个指向volatileTask类对象的指针。

37.   pair类型也是标准库的一部分,可以在单个对象内部把相同类型或不同类型的两个值关联起来。#include <utility>
pair<string,string> author(“James”,”Joyce”);
创建了一个pair对象author,它包含两个字符串,分别被初始化。可以用成员访问符号(member access notation)访问pair中的单个元素,它们名字为firstsecond

author.first == “James”;

38.   类机制支持新类型的设计。操作符重载(operator overloading
一个类包括公有的(public)操作部分和私有的(private)数据部分。这些操作称为该类的成员函数(member function)或方法(method)。

39.   拷贝构造函数(copy constructor),使用另一个对象来初始化一个对象
string ( const string& );

40.   被重载的操作符采用下面的一般形式
return_type operator op ( parameter_list );
//
此处operator是关键字,op是一个预定义的操作符
char& operator[] ( int );
//
声明了一个下标操作符的重载实例,它带有一个int型的参数,返回指向char的引用。

41.   调用成员函数,针对对象的点成员访问符号;针对指针的箭头成员访问符号->

42.   在类定义之外定义的成员函数需要告诉编译器:名字、返回类型、参数表、所属类。
在类体外定义的内联成员函数,应该被包含在含有该类定义的头文件中。

43.   new表达式动态的分配内存时,必须用delete表达式释放
inline string::~string() { delete [] _string }

44.   在类成员函数中this指针被自动设置为指向左侧的类对象。

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值