九重天

一步一步的锻炼;一定会慢慢会实现梦想!

C++基础问题

1。如果C函数的参数为空,其原形必须含关键字void,而c++可有可无!
2。函数之所以可以能递归,是因为每个函数被调用时,都会把参数和其他的局部对象复制到一块专用的内存区域,而且同一个函数的每一个执行进程都有一个单独的复制
3。exter "c"
{                              // 这是个连接说明
 #include "mychdr.h"  // 告诉c++ 库 这是个用C编译的函数
}
4。C++采用名字重组技术,给编译器内部的函数标识符重命名,重组的函数名包含了指定函数的返回植类型和参数类型的符号!
5。自动储存的类型修饰符指定一个局部变量是自动的,即每次执行到定义该变量的语句块时,都将为该变量在内存中产生一个新的副本,并对其进行初始化。
6。静态储存类型初始化值只在语句块第一次执行时其作用,在随后的运行过程中,变量将保持语句块上一次执行的值!
7。static 储存类型修饰符使得函数和变量的标识符对于连接到同一个程序的其他源代码文件而言是不可见的。
8。寄存器变量的地址是无法取得的,因为大多数计算机的硬件寄存器都不占内存地址。
9。C++程序中,默认情况下,函数的所有参数都是以传值方式,即把实参的一个副本复制到被调用函数的形参中。
10。在编译器内部,用一个字符数组来表示字符串常量,对字符串的使用实际上就是在引用它的内部地址,所以把字符串给字符型指针实际上就是把常量的地址赋给指针!
11。当函数的形参是指向非const 型变量的指针时,不能用const型变量的地址做形参!
12。任何地址都可以赋值给void 型指针,C++允许任何类型的指针自动转换成 void型!
13。typedef 的作用是给一个已存在的类型起个别名!
14。指针是储存地址的变量,地址是相对较小的数据单元(在32机系统中占四个字节)它储存另一个数据的地址!
15。# undef 预处理指令使得以定义的宏在以后的代码中无效!
16。不带参数或所有参数都有默认值的构造函数叫做默认构造函数,实例化对象数组必须有默认的构造函数;如果类中之少有一个构造函数,编辑器将不在提供默认的构造函数!
17。静态成员只能在类中申明,必须在类外定义,并且静态成员只能存在唯一一个实例,即使没有任何类的实例,静态成员也是已经存在的,类的所有实例都可以使用他,他属于整个类!
18。静态成员函数与一般成员函数的区别:静态成员函数没有this指针,因此他无法访问非静态成员!一般的成员函数隐含this指针
19。初始化和赋值的区别是:初始化是创建一个新的对象,然后用已有的的对象去初始化,赋值是两个都存在的对象!
20。常量数据成员和引用数据成员必须使用构造函数的参数初始化表来初始化,而不能赋值!
21。对象被申明为常量,那么该对象就不可以调用类中任何非常量型的成员函数。
22。mutable 修饰符申明的数据成员,这样一个常量型的成员函数就可以修改它的值!
23。class member以他们在class 内的申明次序来初始化和他们在member initialization list 中出现的次序无关!
24。string &operation =(const string & rhs);// 意思是将一个常 string  指定给另一个string 
25。string &operator =(const char *rhs);//意思是将一个常 char * 指定给一个string 
26。避免传回内部数据的handls;
27。public继承是一种( isa),所以任何事情只要对base class  而言是真,就一定对其 derived class  为真。
28。纯虚函数的两个接口,他们必须被任何“继承了他们”的子类重新申明,他们在抽象类中通常没有定义!
29。纯虚函数的申明主要是为了让derived class 继承函数的接口;
         虚函数的申明主要是为了让derived class 继承函数的接口及其缺省行为
        成员函数(非虚)的申明主要是为了让derived class 继承函数的实现,表示在 derived  class 中希望不要有不同的行为,即不要重新定义继承而来的非虚成员函数!
30。绝对不要重新定义继承而来的参数值,因为虚拟函数系动态绑定,而缺省参数却是静态绑定的!
31。对象的静态型别是程序申明它时所采用的型别。对象的动态型别是指对象目前所代表的型别,表现出一个对象的行为模式!
40:getlin(s,bufsize)表示读取bufsize-1个字符给s如果遇到换行符就停下来,添加一个空字节,丢弃换行符!
41。编辑器将空白字符默认为分隔符。
42。不允许重载系统中预定义的操作,因此重载操作中至少有个操作数是用户自定义类型!
43。全局const申明默认情况下是内部连接,而在c 中他们是外部连接,如果希望一个const 对象具有外部连接特性,就必须使用关键字“extern”
44.除了寄存器变量以外,程序中的所有对象都存在内存中的。
45。在c++中给void型指针赋值时,不用强制类型转换是一种错误!
46数组名对应着一块内存 其地址与容量在生存周期内不变
C++没有办法知道指针所指的内存容量,除非在申请时记住他。
注意当树组作为函数的参数进行传递时,该树组退化为同类型的指针
void Func(char a[100]) 

   // 4字节而不是100字节 
   cout<< sizeof(a) << endl;
 
}
编译器总要为函数的每个参数制作临时的副本,
引用被创建的同时必须被初始化,
引用必须与合法的储存单元关联
一旦引用被初始法,就不能改变引用的关系
int *p=(int *)malloc(10);表示p指向堆内存,但是p 本身是在栈中的
不要用return 语句返回指向“栈内存”的指针,因为该内存在函数结束时就自动消亡了。
使用free 或delete 释放内存后,并没有将指针设置成NULL,导致产生“野指针”。所以用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。
char *p = "hello world";表示将字符串赋给指针。常量字符串赋,位于静态储存区。
char *p = (char *) malloc(100); 
strcpy(p, “hello”); 
free(p);   
 // p 所指的内存被释放,但是p所指的地址仍然不变 … if(p != NULL) // 没有起到防错作用

// 出错  
strcpy(p, “world”); 
如果在申请动态内存时找不到足够大的内存块,malloc和new将返回NULL指针,宣告申请失败。
exit(1)终止整个程序的运行
如果用new创建对象树组,那么只能使用对象的无参构造函数
对比于C语言的函数,C++增加了重载(overload) 内联 (inline) const virtual四种新机制
注意并不是两个函数的名字相同就能构成重载,全局函数和类的成员函数同名不算重载,因为他们的作用域不同
成员函数的重载和覆盖
成员函数被重载的特征
在同一个类中
函数名字相同
参数不同
virtual  关键字可有可无,
覆盖的特征
不同的范围(分别位于派生类与基类中)
函数名字相同
参数相同
基类函数必须有virtual 关键字
如果派生类的函数与基类的函数同名,但参数不相同,此时,无论有无virtual 关键字,基类的函数将被隐藏(注意与重载混淆)
如果派生类的函数与基类的函数名相同,并且参数也相同,但是基函数没有virtual  关键字,此时,基类的函数被隐
藏(注意与覆盖混淆)
参数缺省值只能出现在函数的申明中,而不能出现在定义体中
如果函数有多个参数,参数只能从后向前缺省,
如果运算符被重载为全局函数,那么只有一个参数的运算符叫做一元运算符,有两个参数的运算符叫做二元运算符。
 如果运算符被重载为类的成员函数,那么一元运算符没有参数,二元运算符只有一个右侧参数,因为对象自己成了左侧参数。
一个类只有一个析构函数和一个赋值函数,但是可以有多个构造函数
构造函数与析够函数与类名同名,没有返回值类型。
构造函数的初始化表的使用规则
如果类中存在继承关系,派生类必须在其初始化






 

posted on 2006-09-02 15:07 九重天 阅读(501) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


My Links

Blog Stats

News

常用链接

留言簿(1)

随笔档案

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜