C++ 备忘录 ( 持续更新中... )

Tip 1:     #include包含头文件的问题

新的编译器格式:

#include <iostream>
using namespace std;

旧的编译器格式:

#include <iostream.h>

注:旧的编译器格式中,包含头文件后,不添加 “using namespace std”

 

Tip 2Windows环境中 ,程序运行时界面自动关闭、一闪而过的问题

解决方法:在main() return 语句前添加 cin.get() 语句;

有时需添加两行这样的代码。


注:cin.get() ,可以读取空格、制表符和换行符。

 

Tip 3C++程序 中也可以使用 C 语言中的输入输出函数,只需包含头文件”stdio.h”

 

Tip 4:访问命名空间std的方法:

         M1:将 using std namespace; 放在函数定义之前,让文件中所有的函数都能够使用名称空间 std 中所有的元素

         M2:将 using std namespace; 放在函数定义中,这样该函数能使用命名空间中所有的元素

         M3:在特定的函数中使用 using std::cout; 这样的命令而不是 using std namespace; 让该函数能够使用指定的元素,如cout

         M4:完全不使用变异命令 using , 在需要使用名称空间 std 中的元素时,使用前缀 std:: ,如下所示

 std::cout << “In This Way” << std::endl ;


Tip 5C++中的语句类型:

l  声明语句——定义函数中使用的变量的名称和类型

l  赋值语句——使用复制操作符 (=) 给变量赋值

l  消息语句——将消息发送给对象,激发某种行动

l  函数调用——执行函数.被调用的函数执行完毕后,程序返回到函数调用语句后面的语句

l  函数原型——声明函数的返回类型、函数接受的参数数量和类型

l  返回语句——将一个值从被调用的函数那里返回到调用函数中

 

Tip 6:拼接字符串常量

         C++允许拼接 字符串常量,任何两个由空白(空格、制表符、换行符)分隔的字符串常量都将自动拼接成一个。

下列语句等效

   cout << “Hello World” << endl;
   cout << “Hello” “ World” << endl;
   cout << “Hello”          “ World” << endl;
   cout << “Hello”
          “ World” << endl;

 

Tip 7sizeof() strlen() 判断字符数组长度的区别

l  sizeof() 返回值是 整个数组的长度;而strlen() 返回的是字符数组中字符串的长度(strlen() 只计算可见字符,不把空字符 ‘\0’ 计算在内),而不是数组的长度。

如:存放 ”cosmic” 时,字符数组长度应不小于 strlen( cosmic ) + 1

 

Tip 8:空指针,当计算机没有足够内存而无法满足new 的请求时,new将返回

         C++中值为的指针被称为空指针(null pointer),C++确保空指针不会指向有效的数据。

         因此,空指针常被用来表示操作符或函数失效。

 

Tip 9:数组名 指针的差别:

         数组名是常量,存放的是数组首个元素的地址,不能修改数组名的值;

         指针是变量,可以改变它的值。

 

Tip 10:枚举 的取值范围

         上限:找到枚举量的最大值,然后找到大于这个最大值的、最小的2的幂,将它减去1

得到的便是上限

         下线:找到枚举量的最小值,如果它小于,则下限为;若它小于,先忽略符号,按照上面的方法,得到上限,再加上负号,就得到下限。

 

Tip 11cin 输入输出的问题

         发送给cin的输入被缓冲,也就是说,只有当用户按下回车键后,才会将以输入的内容发送给程序;而且,cin 会忽略输入的空格和换行符。

如下列程序中:

输入:Hello world this is my # test program

输出:Helloworldthisismy

若要获取输入的空格换行符,应使用cin.get (char)

 

  注:使用cin 读取字符时,会忽略空格;

         若要检查每个字符(包括空格、制表符、换行符),应使用cin.get( ch )

 

Tip 12#define typedef 的区别

下列语句中, pa是一个指针,pb是一个整型变量

#define  INT_POINTER    int *
        
INT_POINTER  pa, pb;

     

Tip 13:关于const 指针的问题

         如果关键字const 出现在 * 的左边, 表示被指物是常量;

如果关键字const 出现在 * 的右边, 表示指针自身是常量

如果出现在 * 的两边, 表示 被指物 指针 两者都是常量. 

int const  *  pi;
const int  *  pi;

两种写法一样, pi指向一个常量

   

Tip 14:将引用参数声明为常量数据的引用的理由

l  使用const 可以避免无意中修改数据的编程错误

l  使用const 使函数能够处理 const const 实参,否则将只能接受与非const数据

l  使用const 引用使函数能够正确生成并使用临时变量


Tip 15:何时使用引用参数

l  程序员能够修改调用函数中的数据对象

l  通过传递引用而不是整个数据对象,可以提高程序的运行速度。

 

注:当数据对象较大时 (如结构和类对象),第二个原因最重要。这些也是使用指针参数的原因。 这是有道理的,因为,引用参数实际是基于指针的代码的另一个接口。

 

Tip 16:何时用指针?何时用引用?

对于使用传递的值而不做修改的函数:

l  如果数据对象很小,如内置数据类型或小型结构,则按值传递。

l  如果数据对象是数组,则使用指针,因为这是唯一的选择,并将指针声明为指向const的指针

l  如果数据对象是较大的结构时,则使用const指针或const引用,以提高程序效率,这样可以节省复制结构所需的时间和空间

l  如果数据对象是类对象,则使用const 引用。类设计的语义常常要求使用引用,这是C++新增这项特性的主要原因,因此,传递类对象参数的标准方式是按引用传递。

   对于修改调用函数中数据的函数:

l  如果数据对象是内置数据类型,则使用指针。如果看到诸如fixit (& x) 这样的代码,(其中 x int型),则很明显,该函数将修改x

l  如果数据对象是数组,则只能使用指针。

l  如果数据对象是结构,则使用引用或指针

l  如果数据对象是类对象,则使用引用

 

Tip 17:在类对象中,赋值 !=  初始化

         C++规定,对象的成员变量的初始化动作发生在进入构造函数本体之前。

         因此,正确的初始化方式为:

   

class Apple
{
public :
    …
    string color;
    Apple();
        
    Apple(string tmp):color(tmp)  {}       // 初始化 ( initializations )
                                           // 构造函数本体不必有任何动作

private:
         …
};


Tip 18:  C++默默编写并调用的函数

class Empty 
{
public :
	Empty() { … }	                            // default 构造函数
	Empty(const Empty& rhs) { … }	            // copy 构造函数
	~Empty() { … }				        // 析构函数

	Empty& operator=(const Empty& rhs) { … }    // copy assignment 操作符.
};

只有当这些函数被需要被调用 ),它们才会被编译器创建出来。

程序中需要它们是很平常的事。下面的代码导致上述每一个函数被编译器产出:

Empty	e1;         // default 构造函数
                            // 析构函数
Empty e2 ( e1 );            // copy构造函数
e2 = e1;                    // copy assignment 操作符


Tip 19:  类中的 static类型函数不能接收 this 指针

你可能感兴趣的:(C++,C++,C++,知识点,effective,Primer)