《C++Primer Plus》学习笔记(三)

1、字符串

char dog [4] = {'A','B','C','D'}; //not a string 

char cat[5] = {'A','B','C','D','\0'}; //is a string

char shirt = "S"; //illegal type mismatch

因为”s“ 表示的是地址

Strlen():不把空字符计算在内。


2、 每次读取一行字符串输入:

1、getline( )

如: cin.getline( name, 20 );

最多读取19个字符,余下的自动存储空字符,在读取指定数目的字符或遇到换行时停止读取。

2、get()

1、cin.get( name,20);//不吸收换行符,需要在调用一个cin.get。

2、cin.get(name,20).get()


3、string 类I/O

char charr[20]; strlen(charr)  = 27;

string str; strlen( str ) = 0;

未初始化的数组内容是未定义的。

Strlen()从数组的第一个元素开始计算字节,直到遇到空字符,而空字符随机出现。

getline(cin, str);   这个函数不是类方法,它将cin作为参数,指出到哪里查找输入。

4、结构简介(OOP的基石)

结构是用户定义的类型,而结构声明定义了这种类型的数据属性。

C++不提倡外部变量,但提倡外部结构声明。

可以将结构作为参数传递给函数,也可以返回一个结构。

两个结构可以使用=号赋值。(称为 成员赋值)。

可以声明没有名称的结构类型,如:

struct 

{

int x,y;

} position;


5、 共用体

用途:当数据项使用两种或更多格式(但不会同时使用)时,可以节省空间

共用体的最大长度为其最大成员的长度

匿名共用体没有名称,其成员将成为位于相同地址处的变量,显然,每次只有一个成员是当前的成员。

struct widget{

char brand[20];

union{

int num ;

char idchar[20];

}

}prize;

可以直接使用 prize.num 或者 prize.idchar它们的地址相同。


6、 指针和自由存储空间

1、计算机存储数据时候必须跟踪的3种基本属性: 1、信息存储在何处。 2、存储的值为多少。3、存储的信息是什么类型。

2、指针是一个变量,存储的是值的地址,而不是值本身。地址是指定的量,而将值视为派生量。指针名表示的是地址,而*操作符被称为间接值或解除操作符,*manly与常规int变量等效。

常规的变量刚好相反:值为指定的量,而地址为派生量


7、 面向对象编程 与传统的 过程性编程 的区别:

OOP强调的是运行阶段(而不是编译阶段)进行决策。

运行阶段决策提供了灵活性,可以提供情况进行调整。如分配内存的大小。


8、 声明和初始化指针

Int  *ptr int* ptr,  没有差别,强调的不同。

第一种(c风格):强调*ptr 是一个int类型的值。

第二种(c++风格):强调int* 是一种类型,是指向int的指针。

int *p1, p2;创建的是一个指针跟一个int变量。

Double * tax;

Char * str; 虽然两个指针指向长度不同的数据类型,但是这两个变量本身的长度通常是相同的(均为地址长度)。

不能简单的将整数赋给指针,如0xB800000为视频内存地址,应该如下操作:int * ptr; ptr = (int*)0xB800000


9、 使用new来分配内存

1、必须声明指针所指向的类型的原因之一:地址本身值指出了对象存储地址的开始,而没有指出其类型(使用的字节数)

2、当内存被耗尽时,无法满足new的请求,new将返回0,在C++中,值为0的指针被称为空值指针(C++确保空值指针不会指向有效的数据)。

10、使用delete来释放内存

1、delete ps;  这将释放ps指向的内存,而不会删除指针ps本身,可以将ps重新指向另一个新分配的内存块。

2、不要尝试释放已经释放过的内存块。-------结果将是不确定的。

3、不能使用delete释放声明变量所获得的内存。如int judge = 100;   int*pi = &judge; delete pi;

4、只能用delete来释放使用new分配的内存,对空指针使用delete是安全

5、使用delete的关键在于,将它用于new分配的内存这并不意味着要使用用于new 的指针,而是用于new的地址。

int * ps = new int;

int * pq = ps;

delete pq;

一般来说不要创建两个指向同一个内存块的指针,这样将增加错误的删除同一个内存块两次的可能性。


11、 使用new来创建动态数组

1、静态联编:数组在编译时加入到程序中。

2、动态联编:运行阶段创建,选择数组的长度。

3、使用new创建动态数组时:

int * psome = new int[10];

则应该使用delete [] psome;来释放整个数组,不仅仅是指针指向的元素。

4、使用delete和new的原则:

1、不要使用delete来释放不是new分配的内存。

2、不要使用delete释放同一个内存块两次。

3、如果使用new[]为数组分配内存,则应使用delete[]来释放。

4、如果使用new[]为一个实体分配内存,则使用delete来释放。

5、对空指针使用delete是安全的。


12、 指针、数组和指针算术

1、指针为变量(能够修改),数组名为常量(因此不能使用arr = arr + 1)。

2、在cout和多数C++表达式中,char数组名,指向char的指针,以及用引号扩起来的字符串常量都被解释为字符串第一个字符的地址。

3、不要用字符串常量或未被初始化的指针来接收输入。


13、 使用new创建动态结构

1、如果结构标识符是结构名,使用句点操作符;如果标识符是指向结构的指针,则使用箭头操作符。1、(*ps).num      2、ps->num;


14、 自动存储、静态存储、动态存储

1、自动存储:

在函数内部定义的常规变量使用自动存储空间(自动变量)。在函数调用时自动产生,函数结束时消亡。

自动变量是一个局部变量。其作用域为包含它的代码块。

2、静态存储:

1、在函数外面定义。

2、在声明变量时使用static

整个程序执行期间都存在的存储方式。

3、动态存储:

               new和delete提供的比上述两种变量更灵活的方式。它们管理了一个内存池。整个内存池同上述的内存是分开的。数                              
       据的生命周期不完全受到程序或函数的生存时间的控制。

                                                                                ---------------------------------------2012年7月13日23:09:05

你可能感兴趣的:(编程,C++,struct,oop,delete,存储)