C++ Primer 学习笔记

来源:互联网 发布:软件行业沙龙 编辑:程序博客网 时间:2024/05/16 04:52

1.C++不允许将函数定义嵌套在另一个函数定义中。每个函数都是独立的,所有函数的创建都是平等的。

 

2.转义字符放在字符串中不需要使用单引号。

 

3.只有在定义数组时才能初始化,以后就不能使用了,也不能将一个数组赋给另一个数组。

 

4.C-风格字符串具有一种特殊的性质:以空字符结尾,空字符被写作\0,其ASCⅡ码为0,用来标记字符串的结尾。

  使用字符数组必须注意,在末尾加上空字符!

 

5.sizeof操作符指出整个数组的长度(字节数);而strlen()函数返回的是存储在数组中的字符串的长度。另外,strlen()只计算可见的字符,而不把空字符计算在内。同时,strlen()函数需要加头文件#include<cstring>

 

6.cin使用空白(空格、制表符和换行符)来定义字符串的边界。

按行读取,用cin.getline(arrayname,arraylength)或者cin.get(); 但是前者不保存换行符,而后者保存换行符,并且cin.get()也可以带同样的参数。

cin.get()也可以用来读取并丢弃换行符。

 

7.使用string类变量,需要加头文件#include<string>

在string类变量使用中,可以用size()方法求字符数,效果和strlen一样。

 

8.当str为string类变量时,可以用getline(cin,str)将一行读取到string对象中。

 

9.结构体声明的位置很重要,一种可以是放在main()函数前面,作为外部声明。另一种是放在main()函数中紧跟在开始括号的后面。但提倡使用外部结构声明。

 

10.共用体union是一种数据格式,它能够存储不同的数据类型,但只能同时存储其中的一种类型。

 

11.和数组一样,指针都是基于其他类型的。 int *pt = &height; 指的是将指针pt指向height的地址。

 

12.一定要在对指针应用解除引用操作符(*)之前,将指针初始化为一个确定的、适合的地址。

 

13.当需要内存时,可以使用new来请求。

   int* pt = new int;  将指针pt指向一块int型的空间

 

14.一定要配对地使用new 和delete,否则会出现内存泄露;只能用delete来释放使用new分配的内存。

 

15.C++为类型建立别名的方式有两种。一种使用预处理器,另一种是用typedef.

①#define BYTE char    //用char替换所有的BYTE

②typedef char byte;     //byte是char的别名,有char一样的功能

 

16.cin处理输入字符时,将忽略空格和换行符;而cin.get(ch)将读取空格字符,并将其赋给变量ch。

 

17.将一个指针数组初始化为一组字符串常量,使每一个元素都是一个char指针。该指针数组的行为与字符串数组类似。

eg:

const char * cities[3]=

{

“Shanghai”,

“Beijing”,

“Tianjin”

};

 

18.利用字符函数库cctype可简化操作;例如:isalpha(ch)用来判断ch是否是字母,isdigit(ch)用来判断是否是0~9的数字。

 

19.写入文本文件:

⑴包含头文件fstream        #include<fstream>

⑵创建一个ofstream对象    ofstream outFile;

⑶将该ofstream对象同一个文件包含起来  outFile.open(“carinfo.txt”);

⑷就像使用cout那样使用该ofstream对象

outFile<<”Year:”<<Year<<endl;

 

20.读取文本信息,也差不多,不过创建的是ifstream对象。

 

21.C++对于函数返回值的类型有一定的限制:不能是数组,但可以是其他任何类型(可以将数组作为结构或对象组成部分来返回)。

 

22.我们知道,C++将数组名解释为其第一个元素的地址。其实,数组名就是指针!

记住: ①arr[i]==*(ar+i)   ②&arr[i]==ar+i

 

23.指向常量的指针pt:

  intage = 39;

  constint * pt = &age;  //不能使用pt来修改这个值

 

  将const变量的地址赋给指向const的指针:

  constfloat g_earth = 9.80;

  constfloat * pe = &g_earth;

 

  注意区别:

  intsloth = 3;

  constint * ps = &sloth;    //允许ps指向另一个位置

  int *const finger = &sloth;  //允许使用finger来修改sloth的值

 

24.函数指针与指针函数的区别:

 double (*pf) (int);  //意味着pf是指向函数的指针

 double *pf (int);   //意味着pf是指向指针的函数

 

25.通过引用变量传递参数,函数将使用原始数据,而不是其拷贝。并且,必须在声明的时候将其初始化。例如:  int & rodents = rats;

 

26.函数模板

 template <class T>      //其中class可以换成typename

 void  Swap(T &a,T&b){ 

  Ttemp; temp =a ; a = b; b =temp;

  }

27.指针数组:数组的内容为指针,即都是一些地址。

  例如: double * pd[3];  返回类型为double *

 

28.编译预处理:

 #ifndef COORDIN_H_

 #define COORDIN_H_

 ...     (函数原型、结构声明)

 ...     (或者模板声明、类声明)

 ...     (或者一些符号常量、内联函数)

 #endif

注意: 在其他文件中这样引入:  #include”coordin.h”

 

29. int global = 10;  //静态变量,链接性为外部,可在其他文件中使用

  static int one = 2;  //静态变量,链接性为内部,只能在包含上述代码

                    的文件中使用

   voidfunc(int n){

  static int count = 0;   //静态变量,没有链接性

  }                

 

30.在多文件程序中,可以在一个文件(且只能在一个文件)中定义一个外部变量。使用该变量的其他文件必须使用关键字extern声明它。

 

31.register声明的变量为寄存器变量,这些变量没有内存地址。register说明符提示编译器,该变量的使用频率很高。

 

32.要创建对象数组,则这个类必须有默认构造函数。

 

33.不要返回指向局部变量或临时变量对象的引用。函数执行完毕,局部变量和临时变量将消失,引用将指向不存在的数据。

 

34.操作符重载,如果是非成员函数的话,那么必须声明为友元函数,这样它才能直接访问类的私有成员。

 

35.静态数据成员在类声明中声明,在包含类方法的文件中初始化。

 

36.如果方法或函数要返回局部对象,则应返回对象,而不是对象的引用。

 

37.有两种机制可用于实现多态公有继承:

  ①在派生类中重新定义基类的方法

  ②使用虚方法

 

38.如果在派生类中重新定义基类的方法,通常应将基类方法声明为虚拟的。这样,程序将根据对象类型来选择方法版本。

 

39.虚基类使得从多个类(它们的基类相同)派生出的对象只继承一个基类对象。

 

40.使用类模板:

  template<class T>

  class Stack{

     private:

        ...

     public:

        bool push(const T &item);
   }

 template<class T>

 Stack<T>::push(const T &item)

  {

  }

  intmain(){

 Stack<int> st;

  }

 

41.字符的输入:

  ①char info[100];

  cin>>info;           //read a word

  cin.getline(info,100);  //read aline,discard \n

  cin.get(info,100);     //read aline, leave \n in queue

  ②string stuff;

  cin>>stuff;           //reada word

  getline(cin,stuff);      //read a line,diacard\n

 

 

42.STL (使用动态内存分配)

STL提供了一组表示容器、迭代器、函数对象和算法的模板。

迭代器其实是广义指针,能够用来遍历容器的对象。

 

#include<vector>

vector<int> scores;

vector<int>::iterator pr;     //声明一个迭代器pr

scores.push_back(temp);

for(pr=scores.begin();pr!=scores.end();pr++)

 cout<<*pr<<endl;

 

几个常用操作:

scores.push_back(temp)   将元素temp添加到容器的末尾

scores.erase(scores.begin(),scores.begin()+2)删除第一和第二个元素

sort(scores.begin(),scores.end())  升序对scores的内容进行排序

 

43.new 动态分配数组空间

  (一)定义一个整数

        int *p =new int;

        int *p =new int(4); //赋初值4

 

  (二)定义一个一维数组

         int *p =new int[SIZE];

         P 指向的为数组的首地址,数组是以int类型为基本单元的,p作为数组名使用

 

  (三)定义一个二维数组

      int(*p)[Column]=new int[SIZE][Column]

      首先定义一个指针(*p)[Column], 它表示指针是以大小为 Column个int类型 空间为基本单元的, 后面的newint[SIZE]...表示开辟一个SIZE个这样大小的空间

 

二维数组时,指针是以Column 个int大小的空间为一个基本单元的。

     

p[0][0] 表示的是第0个这样的基本单元中的第0个元素的值

p[1][0] 表示的是第1个这样的基本单元中的第0个元素的值

 

因此,声明一个二维数组指针

int (*p)[Column];// p指向[Column]结构,而[Column]结构是以int类型为基准单元的。

 

44.只有常成员函数才能操作常对象,没有使用const关键字说明的成员函数不能用来操作常对象;

  使用const说明的数据成员为常数据成员。如果一个类中说明了常数据成员,只有通过构造函数对该数据成员进行初始化。

 

45.C++ 中数组的引用作为函数参数

void func(int (&array)[6]){
}

void main(){
int array[6];

func(array);

}

0 0
原创粉丝点击