c++primer学习小记

原创 2006年05月22日 18:21:00
第一章 开始
1. #include指示符读入指定文件的内容,它有两种格式
#include <some_file.h> :表明该文件是一个工程或标准头文件,查找过程会检查预定义的目录
#include “my_file.h”:表明该文件是用户提供的头文件,查找该文件将从当前文件目录开始。
2. 为了防止头文件被多次包含在一个源文件中,可用条件指示符防止,如:
#ifndef BOOKSTORE_H
#define BOOKSTORE_H
/* Bookstore.h的内容 */
#endif
3. 编译c++程序时,编译器自动定义一个预处理名字__cplusplus(注意两个下划线),可以根据它来判断该程序是否c++程序;在编译标准c时,编译器将自动定义名字__STDC__,二者不会同时被定义。另外两个比较有用的预定义名字是:__LINE__和__FILE__。前者记录文件已经被编译的行数,后者包含正在被编译的文件的名字,如
if( element_count == 0 )
cerr << "Error: " << __FILE__
<< " : line " << __LINE__
<< " element_count must be non-zero./n";
__TIME__:当前被编译文件的编译时间
__DATE__:当前被编译文件的编译日期

注:项2、3请参见程序ifdef_page10.cpp

4. assert( )是C语言标准库中提供的一个通用预处理宏。C à #include <assert.h>,CPP à #include <cassert>
5. 关于注释:/* */不能嵌套,非要嵌套须在/和*之间加空格,单行或半行用//进行注释较好
第二章 C++浏览

1. 在内置数据类型(如int、float、double等)与标准库类的类型之间是复合类型,特别是指针和数组类型。数组是一种顺序容器,包含单一类型的元素。
2. 静态分配:编译器在处理程序源代码时分配,静态对象是有名字的变量,直接对其进行操作,分配和释放由编译器自动处理 --- 效率高但缺少灵活性
动态分配:程序执行时调用运行时刻库函数来分配,是没有名字的变量,须通过指针间接地对她进行操作,由new和delete进行分配和释放。如
int *pint = new int( 1024 ); ------ delete pint;
int *pia = new int[ 4 ]; ------ delete [] pia;
3. 基类和派生类的设计原则:
1) 如果希望阻止派生类直接访问某个成员,就把该成员声明为基类的private成员;如果确信某个成员希望被派生类直接访问,则声明为protected.
2) 找出类型相关的成员函数,并把这些成员函数标记为virtual(虚拟的) --- 基类里面只声明,具体的定义根据不同的派生类而不同。对于一个非虚拟函数的调用,编译器在编译时刻选择被调用的函数。而虚拟函数调用的决定则要等到运行时刻。在执行程序内部的每个调用点上,系统根据被调用对象的实际基类或派生类的类型来决定选择哪一个虚拟函数实例。
4. 不是所有的成员函数都能自动地随类模板的实例化而被实例化,只有真正被程序使用到的成员函数才会被实例化,这一般发生在程序生成过程中的一个独立阶段。
5. void min(double); 以传值的方式传递内建类型是一种常见而可接受的做法
void min(const elemType &); 传递对象应避免,应选择引用或者指针,假如void min(elemType),编译器会调用一个copy constructor以求为该对象制造一份副本,然后才将该副本以传值方式传送。
6. 基于异常的设计:
主要构成:
1) 程序中异常出现的点:一旦识别出异常,就导致抛出raise/throw异常,正常的程序就被挂起,直到异常被处理完毕。如:
if( !infile )
{
string errMsg(“unable to open file: “);
errMsg += filename;
throw errMsg;
}
2) 程序中异常被处理的点.典型地,程序异常的抛出与处理位于独立的函数或成员函数调用中.
7. assert只在程序的debug版时才有效,当表达式为假时,就会弹出一个assertion failed的对话框,提示出错。在release 中assert被完全忽略了,就象不存在一样,assert只是一种调试手段。
8. 名字空间机制允许我们封装名字,否则就有可能污染(影响)全局名字空间.
名字空间别名允许用一个可替代的,短的或更一般的名字与一个现有的名字空间关联:
namespace LIB = IBM_Canada_Laboratory;
namespace DFA = Disney_Feature_Animation;
9. 为了防止c++库的组件污染用户程序的全局名字空间,所有标准C++库的组件都声明在一个被称为std的名字空间内。所以即使我们在程序文本中包含了c++库文件,头文件中声明的组件在我们的头文件中也不是自动可见的。
10. 标准数组---向量:vector,如vector<int> ivec( 10 );
1) vector类模板支持“向现有的数组元素赋值”的概念以及“插入附加元素”的概念------可以在运行时刻动态增长;
2) vector只提供了一个最小集:如等于、小于操作符、size()、empty()等操作。而一些通用的操作如sort()、min()、max()、find()等等则作为独立的泛型算法被提供。
3) 可以使用迭代器对(iterator pair)来标记向量的起始和结束处。迭代器是一个支持指针类型抽象的类对象。begin()和end()
4) 可以应用到向量上的操作惊人地多,但是他们并不是作为vector类模板的成员函数来提供的,他们是以一个独立的泛型算法集的形式,有标准库提供。如:(#include <algorithm>)
a) 搜索算法: find()、find_if()、search()、binary_search()、count()、count_if().
b) 分类排序与通用排序算法:sort()、partial_sort()、merge()、partition()、rotate()、reverse()、random_shuffle().
c) 删除算法:unique()和remove()
d) 算术算法:accumulate()、partial_sum()、inner_product()和adjacent_difference().
e) 生成和变异算法:generate()、fill()、transformation()、copy()和for_each()
f) 关系算法: equal()、min() 和max()
5) vector<int> ivec(10,-1); 表示定义了包含10个int元素,每个元素都被初始化为-1;vector<int> ivec(&ia[2], &ia[5]); 表示用ia[2]、ia[3]、ia[4]来拷贝
6) STL中用法完全不同:首先定义一个空vector: vector<int> text; 赋值的操作不再是索引元素,而是用push_back()在vector后面插入一个元素。访问则用
cout << “words read are: /n”;

for( vector<string>::iterator it = text.begin();
it !=text.end(); ++it )
cout << *it << ‘ ‘;
cout << endl;

注意:不能混用这两种用法:如 vector<int> ivec; ivec[0] = 1024;是错误的,因为ivec还没有第一个元素,我们只能索引vector中已经存在的元素。
7) 对于const 向量的迭代子应该这样定义:vector<int> ::const_iterator it = ivec.begin();
第三章 C++数据类型
1. 文字常量:是不可寻址的,尽管也存在机器内存一个地方。20(十进制)--- 024(八进制)---0x14(十六进制)。
a) 字符型char:可以用一个机器字节来表示
b) 整型int、短整型short、长整型long:典型情况下,short半个字,int一个机器字,long为一个或两个机器字(32位机器中,int和long通常长度相同)
c) float、double和long double,分别为一个字、两个字,三个或四个字。
d) 避免将long写成 2l,最好用大写2L
e) aaa
f) 一些常用字符
l newline(换行符) /n
l horizontal tab(水平制表符) /t
l vertical tab(垂直制表符)
l backspace(退格键) /b
l carriage return(回车键) /r
l formfeed(进纸键) /f
l alert(beel)(响铃键) /a
l backslash(反斜杠键) //
l question mark(问号) /?
l single quote(单引号) /’
l double quote(双引号) /”
g)
2. 变量:是可寻址的,对于每一个变量,都有两个值与其相关联:1)数据值:存储在某个地址中,也被称为右值(rvalue--- are-value),文字和常量都可被用作右值;2)地址值:即存储数据值的那块内存的地址,也叫变量的左值(lvalue---ell-vlaue).
全局变量被初始化为0,局部变量或new则不提供,值是未定义的。
3. 不同数据类型的指针之间的区别不是在指针的表示上,也不再指针所特有的值(地址)上,而在于指针所指向的对象的类型上,指针的类型可以知是编译器怎样解释特定地址上内存的内容,以及该内存区域应该跨越多少内存单元。
4. 当指针持有0值时,表明它没有指向任何对象,或持有一个桶类型的数据对象的地址。
5. C++提供了一种特殊的指针类型来支持“仅仅是持有地址值(可能是把一个地址同另一个地址作比较)”:空(void*)类型指针,它可以被任何数据指针类型的地址值赋值(函数指针不能赋值给它)。如: int *pi = 0; double dval; double *pd = &dval;
void *pv = pi; pv = pd;

6. 字符串类型:2种
1) C风格的字符串:通过char*类型的指针来操纵它。标准c库提供了一组函数:
#include <cstring>
int strlen( const char* );
int strcmp( const char*, const char* );
char* strcpy( char*, const char* );
2) 字符串类型string,它包含一系列函数,如:
size(), empty(), c_str(),
3)
7. const限定修饰符
8. 引用
9. 枚举类型:不能使用枚举成员进行迭代
10. 复数类型 #include <complex>,复数对象有float、double或long double几种表示。
11. typedef名字提供了一种助记符
若:typedef char* cstring;
那么extern const csting cstr;中cstr的类型是什么?
指向const字符的指针???错!!!!!!
正确:Const修饰cstr的类型,cstr是一个指针,cstr是一个指向字符的const指针!!!
12. volatile限定修饰符:提示编译器,该对象的值可能在编译器未监测到的情况下被改变。
13. pair类型:使得我们可以在单个对象内部八项同类型或不同类型的两个值关联起来。
1) 头文件:#include <utility>
pair< string, string > author(“James”, “Joycer”);
2) 可以用成员访问符号访问pair中的单个元素,他们的名字为first和second,如:
string firstBook;
if(author.first ==”James” && author.second == “Joycer”)
firstBook = “Stephen Hero”;

相关文章推荐

C++ Primer Plus(第6版学习小记)-开篇

学习一门语言,一本好的书相当重要,以前在读大学学C语言的时候用的是谭浩强的书,不过感觉学完之后已经快忘的差不多了,除了记得一些基本语法等,很多思绪等都是杂乱的,3年过去了,除了记得它是绿色的封面外,已...

c++primer第五章学习小记

学习笔记
  • linaYYY
  • linaYYY
  • 2017年03月02日 21:21
  • 227

【转】【C/C++】枚举enum学习小记

转载自 edfa enum在实际中应用比较少,容易被忽略。其实enum 和 struct、class一样,都是用户自定义类型。既然是自定义类型,就可以有他的数据成员,还有成员函数...

【C/C++】枚举enum学习小记

转自:http://hi.baidu.com/edfa/blog/item/ae64ea133663f7075aaf53a3.html 参考文献:[1]C++程序设计语言(特别版), 裘宗燕译, 机械...

VC学习小记

  • 2011年11月18日 13:16
  • 68KB
  • 下载

C++ Primer Plus学习笔记之STL算法

C++ Primer Plus学习笔记之STL算法 STL包含很多处理容器的非成员函数,例如sort(),copy(),find(),transform()... 对于算法函数设计,有两个主要...

C++ Primer学习总结_1_开始

今天无意间看了一位博主的文章,文章分享了他在2.5年从菜鸟到收获阿里offer的点滴,深有感触,同时又很惭愧。他无时无刻都在努力,同时又乐于分享他的学习收获。我期望自己也可以做到!所以,启程吧,从今天...

《c++ primer》第10章 泛型算法 学习笔记

概述:大多数算法都定义在头文件#include,标准库还在#include定义了一组数值泛型算法。 泛型算法本身不会执行容器操作,它们只会运行在迭代器之上,执行迭代器的操作 结论:算法永远不会改变底层...

c++ primer 学习笔记9--文件输入输出

书285页,练习8.4 #include #include #include #include using namespace std; int main() { ifstream i...
  • wm_1991
  • wm_1991
  • 2015年04月11日 12:32
  • 254

C++primer学习笔记-----6.7函数指针

【函数指针指向的是函数而非对象。和其他指针一样,函数指针指向某种特定类型。函数的类型由它的返回类型和形参类型共同决定,与函数名无关。bool lengthCompare(const string &,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++primer学习小记
举报原因:
原因补充:

(最多只允许输入30个字)