VC6.0中重载操作符友元函数无法访问类的私有成员的解决办法

合集下载

《CC++程序设计》(高起专)练习题

《CC++程序设计》(高起专)练习题

《C++程序设计》(高起专)练习题一一、单项选择题1.C++是一种()的程序设计语言。

A. 面向对象B. 即可面向过程,又可面向对象C. 面向过程D. 面向系统2.在下面有关析构函数特征的描述中,正确的是()。

A. 一个类中可以定义多个析构函数B. 析构函数名与类名完全相同C. 析构函数不能指定返回类型D. 析构函数可以有一个或多个参数3.下面对于友元函数描述正确的是()。

A. 友元函数的实现必须在类的内部定义B. 友元函数是类的成员函数C. 友元函数破坏了类的封装性和隐藏性D. 友元函数不能访问类的私有成员4.下面描述中,表达错误的是()。

A. 公有继承时基类中的public成员在派生类中仍是public的B. 公有继承时基类中的private成员在派生类中仍是private的C. 公有继承时基类中的protected成员在派生类中仍是protected的D. 保护继承时基类中的public成员在派生类中是private的5.所谓多态性是指()A. 不同的对象调用不同名称的函数B. 不同的对象调用相同名称的函数C. 一个对象调用不同名称的函数D. 一个对象调用不同名称的对象6.重载赋值操作符时,应声明为()函数。

A. 友元B. 虚C. 成员D. 多态7.下列对模板的声明错误的是()。

A. template <class T1,typename T2>B. template <class T1, T2>C. template < typename T>D. template <class T1,class T2,class T3>8.下列类中()不是输入流类istream的派生类。

A. ifstream C. iostream D. ofstream9.()不是构造函数的特征。

A. 构造函数的函数名与类名相同 B 构造函数可以重载C. 构造函数可以设置缺省参数 D构造函数必须指定类型说明10.下列语句中错误的是( )。

CPP复习题答案

CPP复习题答案

13. 派生类的对象对它的基类成员中 ( A ) 是可以采用对象·或者对象指针->的方 B. 公有继承的私有成员 D. 私有继承的公有成员 C ) 。
14. 关于纯虚函数和抽象类的描述中,错误的是( B. 抽象类是指具有纯虚函数的类。
A. 纯虚函数是一种特殊的虚函数,它没有具体的实现。 C. 一个基类中说明有纯虚函数,该基类的派生类一定不再是抽象类。 D. 抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。 15.下列说法错误的是( C )。 A.若语言只支持类而不支持多态,则不能称为面向对象的。 B.在运行时根据其类型确定调用哪个函数的能力叫多态性。 C.静态多态性也是在运行时根据其类型确定调用哪个函数。 D.C++中的静态多态性是通过函数重载进行实现的。 16. ( D )不是构造函数的特征 A. 构造函数的函数名与类名相同。 B. 构造函数可以重载。 C. 构造函数可以设置缺省参数。 D. 构造函数必须指定类型说明。 17.下列标识符中, A 不是 C++的关键字; A. cin B. private C. this D. operator 18.下列标识符中, A. cout A. cout 18.下列标识符中, A A 不是 C++的关键字; C. this C. this D. template D. sizeof 不是 C++的关键字; 不是 C++的关键字; C. this D. sizeof B. virtual B. public
A. 缩短程序代码,少占用内存空间 B. 既可以保证程序的可读性,又能提高程序的运行效率 C. 占用内存空间少,执行速度快 D. 使程序的结构比较清晰 3. 重载函数是( A ) A. 以函数参数来区分,而不用函数的返回值来区分不同的函数 B. 以函数的返回值来区分,而不用函数参数来区分不同的函数 C. 参数表完全相同而返回值类型不同的两个或多个同名函数 D. 参数表和返回值类型都必须是不同的两个或多个同名函数 4. 在 C++中,数据封装要解决的问题是( A. 数据的规范化 C. 避免数据丢失 5. 下列特性中,( B A.继承 之间的关系是( A. 组合关系 B.内联函数 C )。 B. 间接关系 C. 继承关系 D. 直接关系 D )。 B. 便于数据转换 D. 防止不同模块之间数据的非法访问 )不是面向对象的程序设计的特征。 C.多态性 D.封装

VC++6.0裏面20种C语言常见错误代码解释

VC++6.0裏面20种C语言常见错误代码解释

11、error C2509: 'OnTimer' : member function not declared in 'CHelloView'
成员函数“OnTimer”没有在“CHelloView”中声明。
12、error C2511: 'reset': overloaded member function 'void (int)' not found in 'B'
9、error C2146: syntax error : missing ';' before identifier 'dc'
句法错误:在“dc”前丢了“;”。
10、error C2196: case value '69' already used
值69已经用过。(一般出现在switch语句的case分支中)
重载的函数“void reset(int)”在类“B”中找不到。
13、error C2555: 'B::f1': overriding virtual function differs from 'A::f1' only by return type or calling convention
解决方法:
其一,包含正确路径的#include "stdafx.h";
其二,在*.cpp文件的Setting里面设置,C++选项中的分类 precompiled header,选择不包含头文件即可。
2、fatal error C1083: Cannot open include file: 'R…….h': No such file or directory

c友元函数和友元类用法详解

c友元函数和友元类用法详解

c友元函数和友元类用法详解C++中的友元函数和友元类是一种特殊的函数和类,它们可以访问类的私有成员变量和类的私有成员函数。

本文将详细介绍C++中友元函数和友元类的用法,以及在实际编程中应用友元函数和友元类所带来的优势。

首先,让我们来了解一下C++中什么是友元函数和友元类。

友元函数是一种特殊的函数,它允许外部函数访问类的私有成员变量和私有成员函数,而不需要对类进行任何修改。

友元函数还可以在类外定义,以便更加方便地使用它来访问类的私有成员变量和私有成员函数。

友元类是一种特殊的类,它允许一个类的私有成员函数访问另一个类的私有成员函数和私有成员变量,而不需要对类进行任何修改。

友元类也可以定义在类外,但其功能与友元函数不同,友元类可以访问另一个类的整个实例,而友元函数只能访问另一个类的私有成员变量和私有成员函数。

定义友元函数和友元类的用法其实非常简单,我们只需要在类的声明中使用关键字“friend”来指定友元的函数或类就可以了: class A {private:int a;public:void setA (int a);friend void foo (A& A); //友元函数};class B {private:int b;public:void setB (int b);friend class C; //友元类};以上的代码定义了两个类:A类和B类,其中A类定义了一个友元函数foo,而B类定义了一个友元类C。

定义完友元函数和友元类之后,就可以使用它们来访问类的私有成员变量和私有成员函数了。

在实际使用中,友元函数和友元类有着诸多的优势,比如可以更加方便的封装类的私有成员,以及更加方便的实现代码的重构。

首先,友元函数和友元类可以帮助我们更好地封装类的私有成员,使类的私有成员不能被外部类访问。

同时,可以使用友元函数和友元类来实现类的重构,这样可以更加方便地实现代码的复用,让程序更加简洁和易读。

VC6.0 error LNK2001 unresolved external symbol _main解决办法

VC6.0 error LNK2001 unresolved external symbol _main解决办法

VC6.0 error LNK2001: unresolved external symbol _main解决办法学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于编程者来说,最好改的错误莫过于编译错误,而一般说来发生连接错误时,编译都已通过。

产生连接错误的原因非常多,尤其LNK2001错误,常常使人不明其所以然。

如果不深入地学习和理解VC++,要想改正连接错误LNK2001非常困难。

初学者在学习VC++的过程中,遇到的LNK2001错误的错误消息主要为:unresolved external symbol “symbol”(不确定的外部“符号”)。

如果连接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签,将产生此错误消息。

一般来说,发生错误的原因有两个:一是所引用的函数、变量不存在、拼写不正确或者使用错误;其次可能使用了不同版本的连接库。

以下是可能产生LNK2001错误的原因:一.由于编码错误导致的LNK20011.不相匹配的程序代码或模块定义(.DEF)文件能导致LNK2001。

例如, 如果在C++源文件内声明了一变量“var1”,却试图在另一文件内以变量“VAR1”访问该变量,将发生该错误。

2.如果使用的内联函数是在.CPP文件内定义的,而不是在头文件内定义将导致LNK2001错误。

3.调用函数时如果所用的参数类型同函数声明时的类型不符将会产生LNK2001。

4.试图从基类的构造函数或析构函数中调用虚拟函数时将会导致LNK2001。

5.要注意函数和变量的可公用性,只有全局变量、函数是可公用的。

静态函数和静态变量具有相同的使用范围限制。

当试图从文件外部访问任何没有在该文件内声明的静态变量时将导致编译错误或LNK2001。

函数内声明的变量(局部变量) 只能在该函数的范围内使用。

C++ 的全局常量只有静态连接性能。

这不同于C,如果试图在C++的多个文件内使用全局变量也会产生LNK2001错误。

解决VC++6.0不能使用问题

解决VC++6.0不能使用问题

用VC++6.0时点“打开文件”时弹出“ox5003eaed”指令引用的“ox00000000”内存。

该内存不能为“read”2011-07-26 16:44问题:在Visual c + + 中使用键盘快捷键或从"文件"菜单中选择“打开”将产生以下错误:“0x5003eaed指令引用的"0x00000000"内存。

该内存不能为"read"。

要终止程序,请单击"确定"。

要调试程序,请单击"取消"。

” 的一个对话框。

当点击项目——>添加到项目——>文件时,将出现相同错误。

解决:FileTool.exe 是一个示例,用于替换“打开”和“添加到项目”菜单项在 Visual c + + 中使用开发工具 Studio 对象模型。

从 Microsoft 下载中心下载FileTool.exe :/download/vc60ent/s1/6.0/w9xnt4/en-us/filetool.exe自解压 FileTool.exe为FileTool文件夹待用。

为防止文件丢失,可将FileTool文件夹放在Visual c + + 6.0安装文件(:\Program Files\Microsoft Visual Studio)中。

一、首先安装外接程序:1. 运行 Visual c + + 6.0,文件--打开工作空间,打开刚才解压的filetool中的dsw工作空间文件编译,在DBUG文件夹中生成filetool.dll文件2.工具——>定制3.选择“附加项和宏文件”选项卡,单击浏览按钮并找到在第1 步中生成程序FileTool.dll 文件。

二、1. 工具——>定制——>键盘类别——>文件;命令——>FileOpen;编辑器——>主要;当前键——> CTRL + O ,单击“移去”:2. 类别——>工程;命令——>InsertFilesIntoProject。

new 能重载为友元函数

new 能重载为友元函数

new 能重载为友元函数1.引言1.1 概述在C++编程中,函数的重载和友元函数都是非常重要的概念。

函数的重载可以通过相同的函数名在同一作用域内定义多个函数,但参数类型或个数不同,从而根据不同的参数类型来选择调用相应的函数。

而友元函数是指在类外部定义的一个函数,它可以访问类中的私有成员和保护成员,从而实现对类的个别私有成员的特殊处理。

本文将重点讨论新的能够重载为友元函数的特性。

在传统的C++中,只有类的成员函数才能被声明为友元函数,而其他普通函数则不能。

然而,C++中的新特性引入了一种新的语法,使得普通函数也能够被声明为友元函数。

这一新特性在C++11标准中被引入,并在后续的C++标准中得到了进一步的完善和扩展。

通过将函数声明为友元函数,我们能够使这些函数能够访问类中的私有成员和保护成员,进而实现对类的特殊操作和处理。

接下来的章节中,我们将详细介绍函数的重载和友元函数的概念,以及它们在C++中的应用。

首先,我们将介绍重载函数的概念,包括其定义、使用方法和重载解析规则。

然后,我们将讨论友元函数的概念以及其与类的关系。

最后,我们将重点讨论新的能够重载为友元函数的特性,包括其优势和应用场景。

通过本文的学习,读者将能够更好地理解和应用函数的重载和友元函数的概念,进而提升自己的C++编程能力。

文章结构是指文章的组织方式和布局,它有助于读者更好地理解文章的内容和逻辑关系。

在本篇文章中,我们将按照以下结构来撰写和组织内容:1. 引言1.1 概述在这部分,我们将简单介绍本文的主题和内容,即"new 能重载为友元函数"。

1.2 文章结构这部分是我们所在的部分,我们将详细说明本文的结构和组织方式,并简要介绍每个部分的内容。

1.3 目的在这一部分,我们将说明写作本文的目的和意义,以及希望读者能够从本文中获得的收获和启发。

2. 正文2.1 重载函数的概念在这部分,我们将解释什么是函数重载,并介绍其基本概念、特点以及使用方式。

第四章 运算符重载

第四章 运算符重载

4.3重载运算符的规则
(1)C++只允许已有的部分运算符实施重载。 (2)不能重载的运算符有五个。 (3)重载不改变操作数的个数。 (4)重载不改变运算符的优先级。 (5)运算符重载函数不能带默认值参数。 (6)运算符重载函数必须与自定义类型的对象联 合使用,其参数至少有一个类对象或类对象引用。 (7)C++默认提供 = 和 & 运算符重载。
例4.1 通过成员函数实现复数的加法。 class Complex { private: double real; double imag; public: Complex(){real=0;imag=0;} Complex(double r,double i){real=r;imag=i;} Complex complex_add(Complex &c2); void display(); };
int main() {Complex c1(3,4),c2(5,-10),c3; c3=c1+c2; cout<<"c1=";c1.display(); cout<<"c2=";c2.display(); cout<<"c1+c2=";c3.display(); return 0; }
说明: (1)用运算符重载函数取代了例 4.1中的加法成 员函数,从外观上看函数体和函数返回值都是相 同的。 (2)在主函数中的表达式c3=c2+c1 取代了例4.1 中的c3=plex_add(c2) ,编译系统将表达 式c3=c1+c2 解释为 c1.operator + ( c2 ) 对象c1调用的重载函数operator + ,以c2为实参 计算两个复数之和。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VC6.0中重载操作符友元函数无法访问类的私有成员的解决办法
VC6.0中重载操作符友元函数无法访问类的私有成员的解决办法:
在C++中,操作符(运算符)可以被重载以改写其实际操作。

同时我们可以定义一个函数为类的友元函数(friend function)以便使得这个函数能够访问类的私有成员,这个定义通常在头文件中完成。

在Visual C++中定义一般的函数为友元函数通常是没有问题的。

然而对某些重载操作符的函数,即使我们将它们定义为类的友元函数,VC的编译器仍然会显示出错信息,认为这些友元函数无权访问类的私有成员。

我认为这应该是VC6.0编译器与标准C++不兼容的地方。

以下代码就是个例子:
// 头文件“Sample.h”
#include<iostream>
using namespace std;
class Sample{
public:
Sample( );
friend ostream &operator<<(ostream &out, const Sample s);
friend istream &operator>>(istream &in, Sample & s);
private:
int x;
};
// 实现文件“Sample.cpp”
#include “Sample.h”
Sample::Sample( )
{
x=0;
}
istream &operator>>(istream &in, Sample & s)
{
cout<<”Please enter a value”<<endl;
in >> s.x ;
return in;
}
ostream &operator<<(ostream &out, const Sample s)
{
cout << s.x << endl;
return out;
}
以上代码在gnuc++中编译运行毫无问题。

但是在VC++6.0中编译的时候就会出现以下的编
译错误:
Compiling…
Sample.cpp
c:\temp\sample.cpp(8) : error C2248: ‘x’ : cannot access private member declared in class ‘Sample’
c:\temp\sample.h(19) : see declaration of ‘x’
c:\temp\sample.cpp(13) : error C2248: ‘x’ : cannot access private member declared in class ‘Sample’
c:\temp\sample.h(19) : see declaration of ‘x’
Error executing cl.exe.Sample.obj - 2 error(s), 0 warning(s)
在VC++ 6.0中解决这个问题有以下几种方法:
第一种方法:在头文件中类定义之前将类和友元操作符函数的原型特别声明一下,也就是将头文件修改如下(实现文件”Sample.cpp”不用作任何修改):
// 修改后的头文件2 “Sample.h”
#include <iostream>
using namespace std;
// 以下3行代码为新加入
class Sample
{
public:
Sample( );
friend ostream &operator<<(ostream &out, const Sample s);
friend istream &operator>>(istream &in, Sample & s);
private:
int x;
};
第二种方法:在头文件中实现作为友元函数的操作符函数的重载,也就是说在实现文件“Sample.cpp”中将函数重载的实现去掉,而将头文件修改如下:
// 修改后的头文件1 “Sample.h”
#include<iostream>
using namespace std;
class Sample
{
public:
Sample( );
friend ostream &operator<<(ostream &out, const Sample s);
friend istream &operator>>(istream &in, Sample & s);
private:
int x;
};
第三种方法:是对I/O名空间的使用实行明确声明,也就是说在头文件”Sample.h”中直接写:#include<iostream>
using std::ostream;
using std::istream
….
取代“using namespace std;”
注意:在这个例子里我们在实现文件“Sample.cpp”中包含“using namespace std;”这句话,否则在实现中就不能使用“cout”, “cin”, “<< “, “>>”和endl 这些关键字和符号。

修改后的完整代码如下:
// Sample.h
#include<iostream>
class Sample
{
public:
Sample( );
friend ostream &operator<<(ostream &out, const Sample s);
friend istream &operator>>(istream &in, Sample & s);
private:
int x;
};
// “Sample.cpp”
#include “Sample.h”
using namespace std;
Sample::Sample( )
{
x=5;
}
istream &operator>>(istream &in, Sample & s)
{
cout<<”Please enter a value”<<endl;
in >> s.x ;
return in;
}
ostream &operator<<(ostream &out, const Sample s) {
cout << s.x << endl;
return out;
}。

相关文档
最新文档