JunYearPrisoner / some-qusetion-and-address-means-about-compiler

2 stars 4 forks source link

c++【期末考试】易错点 #15

Open JunYearPrisoner opened 3 years ago

JunYearPrisoner commented 3 years ago

1.spiffy.C是有效的Unix c++源代码文件名(区分大小写),也可以用cc,cxx拓展名

2.在c++中类,函数,变量是c++编译器标准组件

3.get()读取空行后将设置失效位。这意味着接下来的输入将被阻断,但是可以用cin.clear()恢复

4. int year; cin>>year; char address[80]; cin.getline(address,80); 这段代码没有读入address。当cin读取年份,将回车生成的换行符留在输入队列中,后边的cin.getline看到换行符后,将认为其是一个空行,并将一个空字符串赋值给address数组。 解决方法:在读取地址之前先丢弃换行符。 如cin>>year; cin.get(); 也可以利用表达式cin>>year返回cin对象,将调用拼接起来。 (cin>>year).get();

5.c++用指针而不是数组处理字符串。

JunYearPrisoner commented 3 years ago

6.枚举:enum 枚举类型名字 {名字0,名字1.......名字n}都是常量符号,类型都是int 7.用引号括起来的字符串常量是地址 8.只需要将源代码文件加入到项目中,而不用加头文件。因为#include指令管理头文件。 9.不要用#include包含源代码文件,这将导致重复声明 10.在同一个文件中只能将同一个头文件包含一次 11.#ifndef COORDINH .......

endif

这段代码意味着仅当以前没有使用预处理器编译指令#define定义名称COORDIN_H_时,才处理#ifindef(if not defined)和#endif之间的语句。

JunYearPrisoner commented 3 years ago

12.但是这种方式并不能防止编译器将文件包含两次,而只是忽略除第一次包含以外的所有内容 13.名称修饰:https://blog.csdn.net/zhouguoqionghai/article/details/50386049 14.连接性描述了名称如何在不同单元间共享。 15.连接性为外部的名称可在文件间共享。 16.连接性为内部的名称只能由一个文件中的函数共享 17.自动变量的名称没有连接性,因为他们不能共享

JunYearPrisoner commented 3 years ago

18.函数的作用域可以是整个类也可以是整个名称空间 19.在默认的情况下,在函数中声明的函数参数和变量的存储连续性为自动,没有连接性。 20.如果一个全局变量和一个局部变量同名,在局部时,新的定义隐藏了以前的定义,新定义可见,旧定义暂时不可见,程序离开局部的作用域时,原来的定义又重新可见 对于使用值传递而不做修改的函数 21.如果数据对象很小,如内置数据类型或小型结构,则按值传递。 22.如果数据对象是数组,则使用指针,因为这是唯一的选择,并将指针声明为指向const指针。 23.如果数据对象是较大的结构,则使用const指针或者const引用,以提高程序的运行效率。这样可以节省复制各结构所需要的时间和空间。 24.如果数据对象是类对象,则使用const引用。

JunYearPrisoner commented 3 years ago

对于修改调用函数中数据的函数 25.如果数据对象是内置数据,则使用指针。如果看到诸如fixit(&x)这项的代码,其中x是int,则很明显,该函数将修改x。 26.如果数据对象是数组,则只能用指针 27.如果数据对象是结构,则使用引用或指针 28.如果数据对象是类对象,则使用引用

JunYearPrisoner commented 3 years ago

29.默认参数是指当函数调用中省略了实际参数时自动调用的一个值。 30.必须通过函数原型修改默认参数的值 31.对于带参数的列表函数,必须从右往左赋值。要为某个参数设置默认值,则必须为它右边的所有参数提供默认值 32.函数模板允许以任意类型的方法来定义函数 33.模板不需要创建任何函数,而只需要告诉编译器如何定义函数

JunYearPrisoner commented 3 years ago

34.get(char*,int)读取换行符会导致cin为false 35.静态局部变量只在程序运行时被初始化,随后的多次中,该值保持不变 36.c++中的存储说明符有:auto(c++11中不是),register,static,extern,thread_local,mutable 37.在同一个声明中不能使用多个说明符,但是thread_local除外,它可以与static或者extern结合使用 38.static用于整个文件的声明时表明内部连接性。被用于局部变量声明时,表示局部变量的存储期为静态的 39.extern表明时引用声明,即声明引用在其它地方定义的变量。 40.auto在11之前可以指出变量为自动变量。11中,用于自动类型判断 41.register用于在声明中指示寄存器存储,11中,只是显示的指出变量是自动的 42.thread_local指出变量的持续性与其所属线程的持续性相同。thread_local变量之于线程(?)犹如常规静态变量之于整个程序。 43.mutable的含义根据const来解释。

JunYearPrisoner commented 3 years ago

44.cv-限定符有:const,volatile 45.const限定符对于默认存储类型,在默认的情况下全局变量的链接为外部的,但const的全局变量的链接性为内部的。也就是说,全局const定义就像使用了static说明符一样 46.如果全局const声明的链接性像常规变量那样是外部的,则根据单定义规则,将出错 47.只能有一个文件可以包含前面的声明,而其他文件必须使用extern关键字来引用声明。 48.只有未使用extern关键字的声明才能进行初始化 49.需要为某个文件使用一组定义,而其他文件使用另一组声明。 50.对于外部定义的const数据的连接性为内部的,所以可以在所有文件中使用相同的声明 51.内部连接性还意味着,每个文件都有自己的一组常亮,而不是所有文件共享一组常量。每个定义都是文件私有的,这就是将常量定义放在头文件中的原因 52。只要在两个源代码中包括相同的一个头文件,则他们会获得同一组常量 53.如果程序员希望某个常量的连接性是外部的,则可以使用extern来覆盖默认的内部连接性 54.在53的情况下,必须在所有使用这个常量的文件中都使用extern来声明

JunYearPrisoner commented 3 years ago

55.c++不允许在一个函数中定义另外有一个函数 56.所有函数的自动存储期都为静态,在整个程序执行期间一直存在。 57.在默认的情况下,函数的链接性为 外部的,可以在文件 中共享。实际上,可以用extern支出函数是在另外一个文件中定义的,还可以使用static将函数的连接性设置为内部 58.要让程序在另一个文件中查找函数,该文件必须作为程序的组成部分被编译,或者是由链接程序搜索的库文件

JunYearPrisoner commented 3 years ago

60.内联函数的特殊规则要求在每个使用它的文件中都对其进行定义。确保内联函数定义对多文件程序中的所有文件都可用,最简单的方法就是宏定义。将内联定义放在定义类的文件中

JunYearPrisoner commented 3 years ago

59.类方法,实例化方法 一、区别 1、静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,所以静态方法可以直接调用。

2、实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。

3、静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快,而且静态内存是有限制的,太多了程序会启动不了。

4、类方法常驻内存,实例方法不是,所以类方法效率高但占内存。

5、类方法在堆上分配内存,实例方法在堆栈上。

6、实例方法需要先创建实例才可以调用,比较麻烦,类方法不用,比较简单。

7、类方法,也称静态方法,指的是用static关键字修饰的方法。此方法属类本身的方法,不属于类的某一个实例(对象)。

8、类方法中不可直接使用实例变量。其调用方式有三种:可直接调用、类名.方法名、对象名.方法名。

9、实例方法指的是不用static关键字修饰的方法。每个实例对象都有自身的实例方法,互相独立,不共享一个。其调用方式只能是对象名+方法名。

二、使用场景 1、如果需要访问或者修改某个实例的成员变量时,将该方法定义成实例方法。类方法正好相反,它不需要访问或者修改某个实例的成员变量。

2、类方法一般用于实现一些工具方法,比如对某个对象进行扩展,或者实现单例。

3、事实上如果一个方法与他所在类型的实例无关,那么它就应该是静态的,决不会有人把它写成实例方法。所以所有的实例方法都与实例有关,既然与实例有关,那么创建实例就是必然的步骤,没有麻烦简单一说。实际上上你可以把所有的实例方法都写成静态的,将实例作为参数传入即可。

链接:https://www.jianshu.com/p/35133302e485

JunYearPrisoner commented 3 years ago

61.operator+()重载+运算符。运算符左边的对象是调用对象,运算符右边的对象的作为参数被传递的对象 62.重载的运算符不必是成员函数,但是必须至少有一个操作数是用户定义的类型 63.使用重载运算符时不能违反运算符原来的法则。不能修改运算符的优先级 64.重载以运算符不能创建新的运算符 65.重载运算符不能重载:sizeof、 ..*::?:typeidconst_castdynamic_castreinterpret_caststatic_cast 66.大多数运算都可以通过成员或非成员函数惊醒重载,但是以下的运算符只能通过成员函数进行重载:=()【】->

JunYearPrisoner commented 3 years ago

67.c++函数原型不能标识函数的功能 68.c++中,对象之间的相互通信通过调用函数成员实现 69.对于任何一个类,析构函数最多有一个 70.友元关系不能继承,友元关系是类与类的关系,是一个成员函数与另一个类的关系,可以提高函数的运行效率 71.语句ofstream f(“salary.dat”,ios::app|ios::binary);的功能是建立流对象f,试图打开文件srlary.dat并与之连接,而且若文件存在,将文件指针定位于文件尾;若文件不存在,建立一个新文件

JunYearPrisoner commented 3 years ago

72.内联函数在编译时将该函数目标代码插入每个调用该函数的地方 73.类的内联函数可以不再类体内定义 74.类的内联函数可以不再类外通过加关键字定义 75.派生类的对象可以复制给基类的对象 76.派生类的对象可以初始化基类的引用 77.派生类的对象不可以直接访问基类中的任何成员 78.派生类的对象的地址可以赋给指向基类的指针 79.c++支持的多态一是编译时(操作重载)的静态多态,二是运行时(虚函数)的动态多态 80.const char * const p =“hello”;所定义的指针p和它所指向的内容都不能被重新赋值

JunYearPrisoner commented 3 years ago

81.const卸载成员函数的函数头和函数体之间时,修饰的是this指针 82.定义析构函数时要注意无形参也不可重载 83.类a是类b友元,但是反之未必成立 84.面向对象 程序设计将数据与对数据的操作放在一起,作为一个相互依存,不可分割的整体来处理 85.在类中声明转换函数时不能指定参数。但是可以指定访问权限、操作、标识符 https://blog.csdn.net/FightFightFight/article/details/79513657?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.control 86.在派生类中重新定义虚函数时必须在参数类型方面与基类保持一致 87.成员函数重载双目运算符时,左操作数时当前对象,右操作数是函数形参 88.c++支持面向对象程序设计的四个要素是:封装性、继承性、抽象性、多态性 89.运算符重载不允许改变运算符的操作个数、优先级、结合性。但是允许改变运算符原来的功能

JunYearPrisoner commented 3 years ago

90.一个类可以在另一个类定义体进行定义 91.通过一个构造函数调用虚函数时,系统对该调用采用静态联编。 92.动态联编和静态联编https://blog.csdn.net/gaoxin1076/article/details/8298279 93.当new运算符动态产生类的对象时,new运算符也自动调用构造函数 94.析构函数和构造函数都不能有返回值 95.友元函数再类中声明 96.在一定条件下,不同类型的数据之间可以进行类型转换,如可以将整型数据赋给双精度型变量。在赋值之前,先把整型数据转换成双精度型数据,然后再把它赋给双精度型变量。这种不同类型数据之间的自动转换和赋值,称为赋值兼容。 97.赋值兼容规则也适用于多重继承的组合 98.拷贝构造函数的参数时某个对象的引用名

JunYearPrisoner commented 3 years ago

99.当一个成员函数被调用时,该成员函数的this指针指向调用它的对象 100.用new申请一个类的动态对象数组时,类中必须能匹配道没有形参或省略形参的构造函数,否则会在编译时出现错误 101.面向对象的四大特征:抽象、封装、继承、多态 102.在基类和派生类中,成员函数的覆盖是指:派生类成员函数与在基类被覆盖的成员函数名、参数个数、参数类型、和返回值类型均相同 103.动态联编要满足两个条件,一个是被调用的成员函数是虚函数,一个是用指针或引用调用虚函数 104.const对象不能被修改,const成员函数不能修改类数据成员 105.c++中没有字符串类型,字符串是通过字符数组来表示的,每一个字符串都有一个结尾字符、0 106.c++没有输入输出语句,输入输出是通过输入输出库实现的 107.c++中两种代码复用方式:继承,复用

JunYearPrisoner commented 3 years ago

108.问:若程序员没有定义拷贝构造函数,则编译器自动生成一个缺省的构造函数,可能会出现什么问题? 答:当对象含有指针数据成员,并且用它初始化同类型的另一个对象时,缺省的拷贝构造函数只能将该对象的数据成员赋值给另一个对象,而不能将该对象中的指针所指向的内存单元也复制过去。这样,就可能出现同一内存单元释放两次,导致程序运行出错

JunYearPrisoner commented 3 years ago

109. 问:简述成员函数、 全局函数和友元函数的差别。

答:成员函数是在类内部定义的,作用域在类的内部,成员函数可以访问类的数据成员(公有、保护和私有数据成员),可以调用该类的其它成员函数(公有、保护和私有成员函数),可以调用全局函数。如果友元函数是另一个类的公有成员函数,则该类的成员函数也只能通过那个类的对象调用,不能调用那个类的保护和私有成员函数。非本类成员函数(其它类成员函数或全局函数)可以通过该类的对象访问该类的公有数据成员和调用该类的的公有成员函数。 不是在类中定义的成员丽数都是全局函数。 如果某一个函数(全局丽数或类的成员函数)定义为另一个类的友元函数,需要在那个类中用friend关键字声明,友元函数并不是类的成员,它的定义自然是在那个类的外面

JunYearPrisoner commented 3 years ago

110. 问:简述结构化的程序设计、 面向对象的程序设计的基本思想。

答:结构化的程序设计将数据和对数据的操作分离,程序是由一个个的函数组成的,面向对象的程序设计将数据和操作封装在一起,程序是由一个个对象组成的,对象之间通过接口进行通信,它能够较好地支持程序代码的复用。

JunYearPrisoner commented 3 years ago

111. 问:结构 struct和类class有什么异同?

答: sstruct和class都可以定义类,但是缺省访问权限说明时,struct 的成员是公有的,而class的成员是私有的。在C++中,struct可被class代替。