
本文共 3291 字,大约阅读时间需要 10 分钟。
一.关于C++的常用注释的三种方法
简要:
第一种方法:(两个斜杆)/ / 第二种方法:()/ * * / 第三种方法:使用预处理形式 #if 0 #endif 详细可以参考该篇二.c++中的作用域 四类(函数原型作用域,局部作用域,类作用域,命名空间作用域)
简要:
1.函数原型作用域:此作用域为c++程序中最小的作用域,生存周期最短。
(即函数形参,在函数的原型声明时的括号里面的形参的作用域就是函数原型作用域。)切记是在函数声明中不是定义 例:int func(int i) i为参数,作用域类型为函数原型类型。2.局部作用域。
3.类的作用域。 4.命名空间作用域。 详细可以参考该篇三.在类中友元函数运算符重载函数原型中必须要有一个该类的对象
因为类的友元函数不能通过对象进行调用
四.类型兼容型规则
下面通过题目来展开
1.在需要派生类对象的地方,可以使用基类的对象代替(X) 原因:在需要基类对象的任何地方,都可以用公有派生类的对象来替代。2.基类对象的地址可以赋值给派生类的指针(X)
原因: 1.基类对象到派生类对象之间的转换是不存在的,编译器时错误,因为基类对象只能是基类对象,它不包含也不能包含派生类的成员,如果允许基类到派生类转换,那么就会试图使用派生类对象访问不存在的成员。2.基类对象的引用或指针到派生类对象的引用或指针也是不存在的,不被允许的,编译时错误,原因同上。
3.派生类的对象可以作为基类的对象来使用,且可以使用所以成员(X)
原因:派生类对象可以作为基类的对象使用,但只能使用基类继承的成员4.派生类的对象可以初始化基类的引用(正确)
原因: 1)派生类的对象可以赋值给基类的对象 2)派生类的对象可以初始化基类的引用 3)派生类的对象的引用可以初始化基类的引用 4)派生类对象的地址可以赋给指向基类的指针(这里常用)5.内联函数
1 内联函数必须是和函数体定义在一起,才有效。像这样的申明Inline Tablefunction(int I)是没有效果的,编译器只是把函数作为普通的函数申明,我们必须定义函数体。 (当然也可以在声明时放Inline,不过必须在定义前加,声明前加是可有可无的)
Inline tablefunction(int I) {return I*I}; 2.可以将定义在类的外部的函数定义为内联函数。3 在C++中,在类的内部定义了函数体的函数,被默认为是内联函数。而不管你是否有inline关键字。
4.内联函数的定义必须出现在内联函数第一个被调用之前。 原因:在编译时,如果在调用时未出现函数的定义,编译器就无法用内联函数体来替换调用函数的表达式。而普通函数在编译时不需要进行替换,因此也就不需要在调用之前定义。 5.内联函数在调用时,是将调用表达式用内联函数体来替换。 (与宏有区别)6.输入流与输出流的成员函数
输入流:istream
1.getline() 函数 2.ignore() 函数 3.ignore() 函数 4.peek() 函数 5.putback() 函数 6.read() 函数 7.gcount 函数 8.open()函数 详细请参考链接:输出流:ostream
1:open成员函数。(也可以是输入流函数)2:close成员函数。
3:put成员函数。
4:write成员函数。
5:seekp和tellp。
6:错误处理函数。
7.抽象类(重要)
概念:包含纯虚函数的类称为抽象类。
注意: 1.抽象类只能用作基类来派生新类,不能用抽象类来声明对象。 原因:因为抽象类中的纯虚函数没有实现相应的功能。 2.但是可以用抽象类声明指针或引用,通过指针或引用来调用派生类对象。8.读取带空格的字符串
1.getline()函数:
注意: cin.getline(str,10); 中的str是char *类型。 getline(cin,str); 中的str是string类型。 2.get()函数3.不能直接使用read()函数
原因:read(1,2);有两个形参,第一个是存储字符的空间,第二个是读取的字符长度。9.C++函数异常说明
异常说明有如下的几种形式:
- 指定异常
T funNname( parameterlist ) throw( T1, T2,····,Tn);
其中 T 是类型, parameterlist 是参数列表, 而类型 T1, T2,····,Tn 是函数会抛出的异常。
- 不抛出异常
T funNname( parameterlist ) throw( );
抛出异常类型列表为空,表示的是该函数不抛出任何类型异常。- 抛出任意类型的异常
T funNname( parameterlist );
这表示该函数可以抛出任意类型的异常。总结:异常说明还是有用的!但更多是写给函数用户看的。让函数用户清楚知道抛出的异常类型,从而更好和正确地在运用此函数时,编写对其的异常检测。
详细请参考:10 枚举变量
以题目为例:
enum fun{a,b=6,c,d=9}中 c的值是7,而不是8.
其余详细可以参考:11.异常处理
1.抛出异常 throw()
语法格式:throw 表达式; 注意: 其中, throw后面的表达式可以是常量、变量或对象。该表达式的类型比表达式的值更重要, 因为catch子句在捕获异常时是根据throw抛出的表达式的类型进行判断的, 而不是表达式的值。如果需要通过throw抛出多个异常, 应该通过throw后的表达式的不同类型进行区分。2.2.捕获异常 catch()
基本语法: catch(异常类型说明符) { 异常处理语句; }有一个比较特殊的可以捕获所有类型的异常
格式如下: catch(…) { 异常处理语句; } 在执行完catch()子句的所有代码后,程序的控制权不会重新跳转回抛出异常的函数中了。12.重载函数
1.不能用函数返回值类型来区分两个重载函数。
2.形参的名字不能用于区别两个同名函数。 3.普通变量与其引用无法区分。 4.如果形参是指针或引用,带const 与不带const 的可以区分**
可以用与区分的是:**函数的参数。(包括 参数个数,类型及顺序)。13.虚基类
1.虚基类与虚函数的区别:
虚基类是用来解决继承时出现的二义性,而虚基函数是用来解决动态多态的绑定问题的。2.虚基类不是在声明基类时声明的,而是在声明派生类,指定继承方式时声明的。
3.虚基类继承中派生类的构造函数:
派生类的构造函数不仅要调用其直接基类的构造函数,还要调用其间接基类的构造函数。4.虚基函数的构造函数只会调用一次
只由最后定义的派生类来调用。
14.对象数组的初始化
1.类似初始化普通数组的方法;
student str[2]={ { 1,2},{ 3,4}};
注意:这种方法需要结合拷贝构造函数
student (const student &);//const student & 格式固定2.```cppstudent str[2]={ student{ 1,2},student{ 3,4}};
15.常数据成员(const)
1.必须进行初始化而且不能被更新。
2.必须通过构造函数的参数列表初始化方式进行初始化。
(也可以在类中初始化常数据成员)private:const double pi=3.14;
3.可以用常数初始化数据成员,还可以用变量初始化。
16.静态常数据成员(static const)
1.必须在类外定义并同时初始化。
(但,如果类型是整型或枚举类型,则可以在类中定义为其指定初始值)private:static const double pi=3.14;
17.常成员函数
1.在类中声明和类外定义都需要关键字const;
2.在函数中只能调用常数据成员。 3.常对象只能调用常成员函数。发表评论
最新留言
关于作者
