一、基础知识点
1、bool operator==(const Array&)const;
字符重载也是个函数,在函数末尾加CONST,这样的函数叫常成员函数。常成员函数可以理解为是一个“只读”函数,它既不能更改数据成员的值,也不能调用那些能引起数据成员值变化的成员函数,只能调用const成员函数。
2、运算符重载
就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。运算符重载的声明方式与方法的声明方式相同,但operator关键字告诉编译器,它实际上是一个运算符重载,后面是相关运算符的符号。
A)重载的运算操作数至少有一个是自定义数据; B)只能重载已有的运算符; C)所有运算符保持其优先级和结合; 2)运算符即函数
在C++中,运算符当作运算符看待,如<<、>>等。
3、引用类型
引用reference 有时候又称为别名alias 它可以用作对象的另一个名字通过引用我们可以间接地操纵对象使用方式类似于指针但是不需要指针的语法在实际的程序中引用主要被用作函数的形式参数——通常将类对象传递给一个函数。
引用类型由类型标识符和一个取地址操作符来定义引用必须被初始化。一旦引用已经定义它就不能再指向其他的对象这是它为什么必须要被初始化的原因。
call by reference 在调用时,表面上看起来传的是变量本身,实际上内部传的是指针,因此可以实现形参与实参的同一性,即对形参的修改能反映到实参。
而call by value 在调用时,传的是和变量值相同的一个临时变量,形参和实参是两个变量,对形参的修改无法影响到实参。
4、switch语句
case标号必须为常量表达式,case标号不可以形成一串(case 1,2,3:错误,应为case1:
case2:case3:)。
Alice Emma has long flowing red hair. Her Daddy says when the wind blows through her hair, it looks almost alive, like a fiery bird in flight. A beautiful fiery bird, he tells her, magical but untamed. \tell her more. Shyly, she asks, \
三、编译错误
1、error LNK2019: 无法解析的外部符号
error LNK2019: 无法解析的外部符号\(??0IntArrayRC@@QAE@PAHH@Z),该符号在函数_main 中被引用
1>D:\\Visual Studio 2008\\Projects\\c++primer\\自定义数组继承\\Debug\\自定义数组继承.exe : fatal error LNK1120: 1 个无法解析的外部命令
解决方法:include对应头文件的cpp文件。 #include” IntArrayRC.cpp”
2、error C2906: “********”: 显式专用化需要“template <>”
实现模板函数需要在函数定义前加上template< Type>
3、fatal error LNK1169: 找到一个或多个多重定义的符号
申明全局变量,全局函数一定要在cpp中申明,其他类引用该全局变量就include该cpp的h文件,然后extern一下就好了,否则容易出现该重复定义错误。
这个\容易\是如何解释的呢?
例如A.h中如果申明了全局变量int Global; 在B.h中include \ extern int Global;
则你include A.h相当于把A.h中全局变量的申明也include进来了,编译器就会认为是重复定义。所以全局变量和函数申明一定要在cpp中!
1、当.h文件里有函数实现时,VS2005编译器报此错误,解决方法 : 1)在.h里的函数声明前加 inline
2)在项目->属性->链接器->命令行->附加选项中加 /force
2、当函数实现位于.cpp文件时,要在函数实现之前加上inline
4、造成LNK2005错误主要有以下几种情况:
1.重复定义全局变量。可能存在两种情况:
A、对于一些初学编程的程序员,有时候会以为需要使用全局变量的地方就可以使用定义申明一下。其实这是错误的,全局变量是针对整个工程的。正确的应该是在一个CPP文件中定义如下:int g_Test;那么在使用的CPP文件中就应该使用:extern int g_Test即可,如果还是使用int g_Test,那么就会产生LNK2005错误,一般错误错误信息类似:AAA.obj error LNK2005 int book c? book@@3HA already defined in BBB.obj。切记的就是不能给变量赋值否则还是会有LNK2005错误。这里需要的是“声明”,不是“定义”!根据C++标准的规定,一个变量是声明,必须同时满足两个条件,否则就是定义: (1)声明必须使用extern关键字; (2)不能给变量赋初值。
所以,下面的是声明:extern int a;
下面的是定义:int a; int a = 0; extern int a =0;
B、对于那么编程不是那么严谨的程序员,总是在需要使用变量的文件中随意定义一个全局变量,并且对于变量名也不予考虑,这也往往容易造成变量名重复,而造成LNK2005错误。 2.头文件的包含重复。往往需要包含的头文件中含有变量、函数、类的定义,在其它使用的地方又不得不多次包含之,如果头文件中没有相关的宏等防止重复链接的措施,那么就会产生LNK2005错误。解决办法是在需要包含的头文件中做类似的处理:
#ifndef MY_H_FILE //如果没有定义这个宏 #define MY_H_FILE //定义这个宏 ……. //头文件主体内容 ……. #endif
上面是使用宏来做的,也可以使用预编译来做,在头文件中加入: #pragma once //头文件主体
3.使用第三方的库造成的。这种情况主要是C运行期函数库和MFC的库冲突造成的。具体的办法就是将那个提示出错的库放到另外一个库的前面。另外选择不同的C函数库,可能会
引起这个错误。微软和C有两种C运行期函数库,一种是普通的函数库:LIBC.LIB,不支持多线程。另外一种是支持多线程的:msvcrt.lib。如果一个工程里,这两种函数库混合使用,可能会引起这个错误,一般情况下它需要MFC的库先于C运行期函数库被链接,因此建议使用支持多线程的msvcrt.lib。所以在使用第三方的库之前首先要知道它链接的是什么库,否则就可能造成LNK2005错误。如果不得不使用第三方的库,可以尝试按下面所说的方法修改,但不能保证一定能解决问题,前两种方法是微软提供的:
A、选择VC菜单Project->Settings->Link->Catagory选择Input,再在Ignore libraries 的Edit栏中填入你需要忽略的库,如:Nafxcwd.lib;Libcmtd.lib。然后在Object/library Modules的Edit栏中填入正确的库的顺序,这里需要你能确定什么是正确的顺序。
B、选择VC菜单Project->Settings->Link页,然后在Project Options的Edit栏中输入/verbose:lib,这样就可以在编译链接程序过程中在输出窗口看到链接的顺序了。
C、选择VC菜单Project->Settings->C/C++页,Catagory选择Code Generation后再在User Runtime libraray中选择MultiThread DLL等其他库,逐一尝试。
5、LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
低版本到高版本转换之后容易出现该问题。
解决方法:项目\\属性\\配置属性\\清单工具\\输入和输出\\嵌入清单: “是”改成“否”。

