现在的位置: 首页 > 综合 > 正文

C/C++要了解的几点

2013年10月23日 ⁄ 综合 ⁄ 共 3722字 ⁄ 字号 评论关闭

1.case后只能是整型或字符型的常量或常量表达式。

2.按字母或数字顺序排列各条case语句。

3.case语句中,要把正常情况放在前面,而把异常情况放在后面。

4.在多重循环中,尽量吧最长循环放在最内层,最短循环放在最外层,以减少cpu跨切循环层的次数。

5.void真正发挥的作用在于:对函数返回的限定;对函数参数的限定。

6.在C中,可以给无参函数传递任意类型的参数,但是在C++编译器中编译同样的代码则会出错。

7.如果函数的参数可以是任意类型的指针,则应声明其参数为void *。

8.编译器通常不为普通const只读变量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的值,没有了存储和读内存的操作,效率变高。如:

#define M 3
const int N= 5;
...
int j = N;//此时为N分配内存,以后不再分配
int I = M;//预编译期间进行宏替换,分配内存
int j = N;//没有内存分配
int J = M;//再进行宏替换,又一次分配内存

const定义的只读变量指给出了内存地址,而不像#define一样给出的是立即数。故const定义的只读变量在程序运行过程中只有一个备份(因为他是全局的只读变量,存放在静态区)。#define宏是在预编译阶段进行替换,而const修饰的只读变量是在编译的时候确定其值。另外,#define宏没有类型,而const修饰的只读变量有特定类型。

9.union关键字维护足够的空间来放置多个数据成员中的“一种”,一个union只配置一个足够大的空间容纳最大长度的数据成员,而不是为每一个数据成员分配空间。在union中所有的数据成员共用一个空间,同一时间只能存其中一个数据成员,所有数据成员有相同的起始地址。

10.存储模式:大端模式:字数据的高字节存储在低地址中,而低字节存储在高地址中。小端模式刚好相反。

11.我们利用union类型数据“所有成员的起始地址一致”的特点编写程序,判断当前系统的存储模式,如下:

#include <iostream> 
using namespace std;
int checkSystem() { 
	union check 
	{ 
		int i; 
		char ch; 
	}c; 
	c.i = 1;
	cout << (int)c.ch << endl;//c.ch == 1则为小端存储
	return (c.ch == 1); 
} 
int main() 
{ 
	cout << checkSystem() << endl; // 返回1则为小端存储,否则为大端存储 
	return 0; 
}

12.枚举类型使用方法:

定义式:

enum emum_type_name   //emum_type_name是自定义的一种数据类型名

{
    ENUM_CONST_1,
    ENUM_CONST_2,
    ...
    ENUM_CONST_n,
} enum_variable_name;   //emum_variable_name是emum_type_name类型的一个变量,即枚举变量

enum_type_name类型是对一个变量取值范围的限定,而花括号内是他的取值范围。即emum_variable_name只能取花括号内范围的值。

13.枚举与#define宏的区别:

  • #define宏常量是在预编译阶段进行简单替换,枚举常量则是在编译的时候确定其值;
  • 一般在调试器中,可以调试枚举常量,但不能调试宏常量;
  • 枚举可以一次定义大量相关的常量,而#define宏一次只能定义一个。

14.typedef的真正意思是给一个已经存在的数据类型(注意:是类型而不是变量)取一个别名,而非定义一个新的数据类型。下面:

typedef struct student
{
   //code
} Stu_st, *Stu_pst;
(A) struct student stu1和Stu_st stu1没有区别
(B) struct student *stu2, Stu_pst stu2和Stu_st *stu2没有区别

15.typedef与#define宏的区别:

16. char arr[10] = "rose";

cout << arr << endl;//rose

数组名是收元素的地址,cout对象认为char的地址是字符串的地址,因此它该地址处的字符,然后继续打印后面的字符,直到遇到空字符(\0)为止。

总之,如果给cout提供一个字符的地址,则它将从该字符开始打印,直到遇到空字符为止。

17. 多态

引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数(Virtual Function)
实现
的。

C++中的多态性具体体现在运行和编译两个方面。运行时多态是动态多态,其具体引用的对象在运行时才能确定。编译时多态是静态多态,在编译时就可以确定对象使用的形式。C++中,实现多态有以下方法:虚函数,抽象类,重载,覆盖,模版

18. 重载和覆盖

重载(overload),是发生在同一类中。与什么父类子类、继承毫无关系。    
 标识一个函数除了函数名外,还有函数的参数(个数和类型)。也就是说,一个类中可以有两个或更多的函数,叫同一个名字而他们的参数不同。    
 他们之间毫无关系,是不同的函数,只是可能他们的功能类似,所以才命名一样,增加可读性,仅此而已!  
覆盖(override),是发生在子类中!也就是说必须有继承的情况下才有覆盖发生。
我们知道继承一个类,也就有了父类了全部方法,如果你感到哪个方法不爽,功能要变,那就把那个函数在子类中重新实现一遍。  

19.什么是虚指针?虚指针或虚函数指针是一个虚函数的实现细节,带有虚函数的类中的每一个对象有一个虚指针指向该类的虚函数表。

20.纯虚函数:纯虚函数是一种特殊的虚函数,它的一般格式如下:
class <类名>
{
virtual <类型><函数名>(<参数表>)=0;

};在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。

纯虚函数可以让类先具有一个操作名称,而没有操作内容,让派生类在继承时再去具体地给出定义。凡是含有纯虚函数的类叫做抽象类。这种类不能声明对象,只是作为基类为派生类服务。除非在派生类中完全实现基类中所有的的纯虚函数,否则,派生类也变成了抽象类,不能实例化对象。

21.四种类型转换:static_cast,const_cast,dynamic_cast 和reinterpret_cast。

1.static_cast

最常用的类型转换符,在正常状况下的类型转换,如把int转换为float,如:int i;float f; f=(float)i;或者f=static_cast<float>(i);

2.const_cast

用于取出const属性,把const类型的指针变为非const类型的指针,如:const int *fun(int x,int y){}  int *ptr=const_cast<int *>(fun(2.3))

3.dynamic_cast

该操作符用于运行时检查该转换是否类型安全,但只在多态类型时合法,即该类至少具有一个虚拟方法。dynamic_cast与static_cast具有相同的基本语法,dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。如:

class C

{

  //…C没有虚拟函数

};

class T{

  //…

}

int main()

{

  dynamic_cast<T*> (new C);//错误

}

此时如改为以下则是合法的:

class C

{

public:

  virtual void m() {};// C现在是 多态

}

4.reinterpret_cast

interpret是解释的意思,reinterpret即为重新解释,此标识符的意思即为数据的二进制形式重新解释,但是不改变其值。如:int i; char *ptr="hello freind!"; i=reinterpret_cast<int>(ptr);这个转换方式很少使用。

22.关键字static的作用:

1.在函数体内,其作用范围是该函数体,不同于auto变量,其内存只被分配一次,因此下次调用时仍维持上次的值;

2.在模块内,static全局变量可被模块内所有函数访问,但不能被模块外函数访问;

3.在模块内,static函数,作用范围为声明他的模块,只允许被模块内函数调用。

4.在类中,static成员变量,属于整个类拥有,对类的所有对象只有一份拷贝;

5.在类中,static成员函数,属于整个类拥有,这个函数不接受this指针,因而综合4、5点,类对象只能访问类的static成员变量,不能访问static成员函数。

抱歉!评论已关闭.