7_静态成员函数_运算符重载_临时对象

合集下载

C++基础系列——运算符重载

C++基础系列——运算符重载

C++基础系列——运算符重载1. 运算符重载简介所谓重载,就是赋予新的含义。

函数重载(Function Overloading)可以让⼀个函数名有多种功能,在不同情况下进⾏不同的操作。

同样运算符重载(Operator Overloading)可以让同⼀个运算符可以有不同的功能。

可以对 int、float、string 等不同类型数据进⾏操作<< 既是位移运算符,⼜可以配合 cout 向控制台输出数据也可以⾃定义运算符重载:class Complex{public:Complex();Complex(double real, double imag);Complex operator+(const Complex &a) const;void display() const;private:double m_real;double m_imag;};// ...// 实现运算符重载Complex Complex::operator+(const Complex &A) const{Complex B;B.m_real = this->m_real + A.m_real;B.m_imag = this -> m_imag + A.m_imag;return B;// return Complex(this->m_real + A.m_real, this->m_imag + A.m_imag);}int main(){Complex c1(4.3, 5.8);Complex c2(2.7, 3.7);Complex c3;c3 = c1 + c2; // 运算符重载c3.display();return 0;}运算结果7 + 9.5i运算符重载其实就是定义⼀个函数,在函数体内实现想要的功能,当⽤到该运算符时,编译器会⾃动调⽤这个函数,它本质上是函数重载。

运算符重载

运算符重载

// 顺序错误
.
27
由于使用友元会破坏类的封装,要尽量将运算 符重载函数定义为成员函数。
除非有特殊需要,才使用友元函数重载运算符。
.
28
4.5重载双目运算符
双目的意思是运算符左边和右边的操作数均参 加运算。
如果要重载 B 为类的成员函数,使之能够实 现表达式 oprd1 B oprd2,其中 oprd1 为A 类 对象,则 B 应被重载为 A 类的成员函数,形 参类型应该是 oprd2 所属的类型。
.
24
加法运算符重载为友元函数,C++ 在编译时将表达式 c1+c2解释为
operator + ( c1, c2) 即相当于执行以下函数
Complex operator + ( Complex & c1, Complex & c2 ) {
return Complex( c1.real + c2.real , c1.imag + c2.imag ) ; }
.
3
运算符重载的实质
运算符重载是对已有的运算符赋予多重含义。
必要性:C++中预定义的运算符其运算对象只 能是基本数据类型,而不适用于用户自定义类 型(如类)
实现机制
将指定的运算表达式转化为对运算符函数的调用, 运算对象转化为运算符函数的实参。
编译系统对重载运算符的选择,遵循函数重载的选 择原则。
friend Complex operator + ( int & i , Complex & c )
{
return Complex( c.real + i , c.imag ) ;

国家二级C++机试(运算符重载、模板和C++流)模拟试卷6

国家二级C++机试(运算符重载、模板和C++流)模拟试卷6

国家二级C++机试(运算符重载、模板和C++流)模拟试卷6(总分:58.00,做题时间:90分钟)一、选择题(总题数:29,分数:58.00)1.若在表达式y/x中,''/''是作为成员函数重载的运算符,则该表达式还可以表示为( )。

(分数:2.00)A.x.operator/(y)B.operator/(x,y)C.y.operator/(x) √D.operator/(y,x)解析:解析:运算符函数的函数名是由运算符前加关键字operator构成的。

所以当“/”作为运算符重载后,其格式为operator/。

所以其作为成员函数调用时的格式为y.operator/(x)。

2.有类定义如下: class Type{ public: Type(int i=0); Type operator-(int); friend Type operator+(Type,Type); private: int val; };若有对象定义Type c1;则下列语句序列中,错误的是( )。

(分数:2.00)A.Type(3)+c1;B.e1+Type(3);C.3-c1:√D.c1-3;解析:解析:由于在类Type中对“-”进行了重载,所以根据“-”重载的形式定义,c1-3是正确的,而3-c1是错误的表达式。

3.若要对Data类中重载的加法运算符成员函数进行声明,下列选项中正确的是( )。

(分数:2.00)A.Data+(Data);B.Data operator+{Data};√C.Data+operator{Data};D.operator+(Data,Data);解析:解析:“+”是一个二元运算符,因此作为成员函数重载时参数表中只有一个参数,对应于第二个操作数,而第一个操作数是对象本身。

运算符函数的函数名是由运算符前加关键字operator构成的。

4.若要对类BigNumber中重载的类型转换运算符long进行声明,下列选项中正确的是( )。

第7章 函数重载和运算符重载

第7章 函数重载和运算符重载

7.3 运算符重载
•7.3.2 单目运算符的重载 单目运算符重载时参数只有一个。
class Matrix{ public: Matrix operator –( ); //其他成员 //成员函数,参数表为空
}; Matrix Matirx::operator –( ) { Matirx m(rows,cols); //临时对象 for(int i=0;i<rows;i++) for(int j=0;j<cols;j++) m(m,j)= –(*this)(i,j); return m; }
7.3 运算符重载
Matrix & Matrix::operator=(Matrix &src) { //将 src 的所有元素都复制过来 for(int i=0;i<rows*cols;i++) mem[i]=src.mem[i]; return *this; }
7.3 运算符重载
3. 插入抽取运算符的重载 我们可以通过重载插入和抽取运算符来 获得这种效果。重载的运算符形式如下:
7.3 运算符重载
•7.3.4 特殊运算符的重载 1. 自增自减运算符的重载 如果将自增自减运算符定义为类的成员函数, 则应该没有参数。但是为了区分前缀和后缀, C++规定:后缀自增自减运算符定义时带有一 个整型参数,而前缀自增自减运算符时不带 参数,这样在编译时,系统就知道所重载的 是前缀还是后缀运算符了。
7.3 运算符重载
运算符的重载形式有两种,一种是重载为类 的成员函数,另一种是重载为独立的运算符 函数,一般是作为类的友元函数。运算符重 载的语法形式如下: <函数类型> operator <运算符> (<形参表>) { <函数体> }

重载的概念(精)

重载的概念(精)

重载
} vector vector::operator -( vector v1) {
vector v;
v.x = - v1.x; v.y = - v1.y;
return v;
} void main() { vector v1(4.5,-7.8),v2(-1.5,1.2);
v1.print();
重载
Increase & operator ++(); Increase operator ++(int); void display() {cout <<"the value is"<<value<<endl;} //前缀方式
重载
protected:
int value; }; Increase & Increase::operator ++() {
重载
例1 求绝对值函数abs()的重载。 int abs(int x) {
return(x>=0?x:-x);
} float abs(float x) { return(x>=0?x:-x); } long abs(long x)
{
重载
return(x>=0?x:-x);
} double abs(double x) { return(x>=0?x:-x);
v2.print();
重载
}
运行结果为: 4.5 -7.8 -1.5 1.2 3 -3 -6.6 6.6
重载运算符在调用时仍然是靠参数区分的。上例中 重载的运算符“-”,若出现在两个数据之间,只要这两 个数据为相同的基本数据类型、vector类型或其它重载 过的类型,都能正确调用相应的运算代码;若它单独出 现在某个基本数据类型或vector类型等重载过的数据前 面,则自动执行求“相反数”的运算。

运算符重载函数的两种主要方式

运算符重载函数的两种主要方式

运算符重载函数的两种主要方式
运算符重载是C++语言中的一种特性,它可以让用户定义类或结构体中的运算符的行为,以满足用户的需求。

换句话说,运算符重载就是在类或结构体中定义新的运算符,以替代原有的运算符。

一般来说,运算符重载通过两种主要方式实现:类内重载和类外重载。

类内重载是将运算符重载函数定义在类内部,该函数的声明必须使用operator关键字。

这种方式的优点是可以使用类的受保护成员。

类内重载的运算符函数有一个或两个参数,参数的类型是类的类型,或者是类的对象。

类外重载是在类外定义运算符重载函数,该函数的声明仍然要使用operator关键字,但参数的类型是左操作数和右操作数的类型。

类外重载的运算符函数有两个参数,参数的类型是左操作数和右操作数的类型。

类外重载的优点是可以使用不同类型的操作数,而类内重载的运算符函数只能使用类的类型或类的对象作为参数。

使用运算符重载有很多优点,可以提高程序的可读性,使代码更加容易理解。

此外,运算符重载还可以减少代码量,减少函数调用的次数,以及提高程序的效率。

总之,运算符重载是一种有效的编程技巧,可以提高程序的可读性,提高程序的效率,增加程序的可维护性,减少代码量。

使用运算符重载,可以使用户能够更加熟练地使用C++语言,也可以更好地保护类的封装性。

C#中的静态成员、静态方法、静态类介绍

C#中的静态成员、静态方法、静态类介绍

C#中的静态成员、静态⽅法、静态类介绍1.静态成员、实例成员1.1定义及说明数据成员:静态成员:静态成员变量是和类相关联的,可以作为类中"共"有的变量(是⼀个共性的表现),他不依赖特定对象的存在,访问的时候通过类名加点操作符加变量名来访问.实例成员:实例成员变量是和对象相关联的,访问实例成员变量依赖于实例的存在.函数成员:静态⽅法:静态⽅法是不属于特定对象的⽅法,静态⽅法可以访问静态成员变量和静态⽅法;静态⽅法不可以直接访问实例变量和实例⽅法,可以间接调⽤,⾸先要创建⼀个类的实例,然后通过这⼀特定对象来调⽤静态⽅法;实例⽅法:⼀个实例⽅法的执⾏与特定对象关联,他的执⾏需要⼀个对象存在。

实例⽅法可以直接访问静态变量和实例变量,当多个实例对象存在时,内存中并不是存在美个特定的实例⽅法的拷贝,⽽是,相同类的所有对象都共享每个实例⽅法的⼀个拷贝(实例⽅法只占⽤“⼀套”空间)。

静态⽅法和实例⽅法的访问权限表静态成员变量静态⽅法实例成员变量实例⽅法静态⽅法直接访问直接访问不可直接访问不可直接访问实例⽅法直接访问直接访问直接访问直接访问总之:实例⽅法的存在必须要有对象实例的存在,如果对象实例不存在,则实例⽅法也就没有调⽤它的主⼈。

静态⽅法的存在前提是类的存在,所以⽆需声明和New对象。

1.2代码演⽰class Program{static void Main(string[] args){Class1.CallObjectFunc();//静态调⽤Console.WriteLine(Environment.NewLine);Class1 tmpClass = new Class1();//实例调⽤tmpClass.ObjectFunc();Console.ReadKey();}}class Class1{static int Class_m = 9;//静态成员private int object_m = 8;//实例成员public static void CallObjectFunc(){Console.WriteLine("------------静态⽅法调⽤开始:");Class1 class1 = new Class1();class1.ObjectFunc();Console.WriteLine("object_m:" + class1.object_m.ToString());Console.WriteLine("------------静态⽅法调⽤结束:");}public void ObjectFunc(){Console.WriteLine("实例⽅法调⽤开始:");Console.WriteLine("Class_m:" + Class_m.ToString());Console.WriteLine("实例⽅法调⽤结束:");}}输出结果:2.静态类类可以声明为 static 的,以指⽰它仅包含静态成员。

C++运算符重载三种形式(成员函数,友元函数,普通函数)详解

C++运算符重载三种形式(成员函数,友元函数,普通函数)详解

C++运算符重载三种形式(成员函数,友元函数,普通函数)详解三种重载⽅式⾸先,介绍三种重载⽅式:1//作为成员函数重载(常见)2class Person{3 Private:4string name;5int age;6public:7 Person(const char* name, int age):name(name),age(age){}8bool operator<(const Person& b);910 };11bool Person::operator<(const Person& b)12 {13//作为成员函数时,*this即为左操作数a14 ...15 }1//作为友元函数重载2class Person{3private:4string name;5int age;6public:7 Person(const char* name, int age):name(name),age(age){}8 friend bool operator<(const Person& a,const Person& b);910 };11bool operator<(const Person& a,const Person& b)12 {13 ...14 }1//作为普通函数重载(不推荐)2class Person{3public://注意,重载运算符为普通函数时,使⽤到的类成员必须为public4string name;5int age;6public:7 Person(const char* name, int age):name(name),age(age){}89 };10bool operator<(const Person& a,const Person& b)11 {12 ...13 }作为成员函数重载先介绍第⼀种:bool Person::operator<(const Person& b),bool是函数返回类型,Person::只是指定了成员函数所属类名。

C++实验报告之静态成员、运算符重载

C++实验报告之静态成员、运算符重载

题目1:定义一个复数类,通过重载运算符:*,/,直接实现二个复数之间的乘除运算。

编写一个完整的程序,测试重载运算符的正确性。

要求乘法“*”用友元函数实现重载,除法“/”用成员函数实现重载。

源程序1/*******************第1题*******************//******************单森汉*****************//******************2012-5-1*****************/#include<iostream>using std::cout;using std::endl;class Complex{float Real, Image;public:Complex(float r=0,float i=0) { Real=r;Image=i;}void Show(){cout <<"Real="<<Real<<'\t'<<"Image="<<Image<<'\n';}friend Complex operator *(Complex &, Complex &);Complex operator /(Complex &); //重载运算符+Complex operator +( Complex &);friend Complex operator -(Complex &, Complex &);};Complex operator *( Complex &c1,Complex &c2){Complex t;t.Real=c1.Real * c2.Real - c1.Image * c2.Image;t.Image = c1.Image*c2.Real +c1.Real* c2.Image;return t;}Complex Complex::operator /(Complex &c){Complex t;t.Real =(Real *c.Real+ Image * c.Image)/(c.Real*c.Real+ c.Image * c.Image);t.Image = (Image *c.Real - Real * c.Image)/(c.Real*c.Real+ c.Image * c.Image);return t;}Complex Complex::operator + ( Complex &c){Complex t;t.Real = Real + c.Real;t.Image = Image + c.Image;return t;}Complex operator -(Complex &c1, Complex &c2){Complex t;t.Real=c1.Real-c2.Real;t.Image=c1.Image-c2.Image;return t;}void main(){Complex c1(1,2),c2(3,4),c3;c3=c1*c2;cout<<"两个复数的乘法c3=c1*c2:";c3.Show();c3=c1/c2;cout<<"两个复数的除法c3=c1/c2:";c3.Show();Complex c4(1,2),c5(3,4),c6,c7(1,2),c8(3,0),c9; c6=c4+c5;cout<<"两个复数的加法c6=c4+c5:";c6.Show();c6=c4-c5;cout<<"两个复数的减法c6=c4-c5:";c6.Show();c9=c7+c8;cout<<"一个复数与一个实数的加法c9=c7+c8:"; c9.Show();c9=c7-c8;cout<<"一个复数与一个实数的减法c9=c7-c8:"; c9.Show();}运行结果截图题目2:定义一个向量(一维数组)类,通过重载运算符实现向量之间的加法和减法。

最新全国计算机等级考试二级c++题库7(共17套)

最新全国计算机等级考试二级c++题库7(共17套)

第七套1、数据库管理系统是______。

A、操作系统的一部分B、在操作系统支持下的系统软件C、一种编译系统D、一种操作系统数据库管理系统是数据库的机构,它是一种系统软件,负责数据库中的数据组织、数据操纵、数据维护、控制及保护和数据服务等。

故本题答案为B。

2、对于循环队列,下列叙述中正确的是______。

A、队头指针是固定不变的B、队头指针一定大于队尾指针C、队头指针一定小于队尾指针D、队头指针可以大于队尾指针,也可以小于队尾指针所谓循环队列,就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。

在循环队列中,用队尾指针rear指向队列中的队尾元素,用排头指针front指向排头元素的前一个位置。

循环队列主要有两种基本运算:入队运算与退队运算。

每进行一次入队运算,队尾指针就进一。

每进行一次退队运算,排头指针就进一。

当rear或front的值等于队列的长度+1时,就将rear或front的值置为1。

一般情况下,rear大于front,因为入队的元素肯定比出队的元素多。

特殊的情况是rear到达数组的上限之后又从数组的低端开始,此时,rear是小于front的。

故本题答案为D。

3、算法的空间复杂度是指______。

A、算法在执行过程中所需要的计算机存储空间B、算法所处理的数据量C、算法程序中的语句或指令条数D、算法在执行过程中所需要的临时工作单元数一个算法的空间复杂度,一般是指执行这个算法所需要的内存空间。

故本题答案为A。

4、下列数据结构中,能够按照"先进后出"原则存取数据的是______。

A、循环队列B、栈C、队列D、二叉树在栈中,允许插入与删除的一端称为栈顶,而不允许插入与删除的另一端称为栈底。

栈顶元素总是最后被插入的元素,从而也是最先能被删除的元素;栈底元素总是最先被插入的元素,从而也是最后才能被删除的元素。

即栈是按照"先进后出"或"后进先出"的原则组织数据的。

C++期末试卷(五)

C++期末试卷(五)

C++程序设计模拟试卷(五)一、单项选择题(本大题共20小题,每小题1分,共20分)在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。

错选、多选或未选均无分。

1. 静态成员函数没有()A. 返回值B. this指针C. 指针参数D. 返回类型答案:B解析:(P107)静态成员函数是普通的函数前加入static,它具有函数的所有的特征:返回类型、形参,所以使用(P107)静态成员函数,指针可以作为形参,也具有返回值。

静态成员是类具有的属性,不是对象的特征,而this表示的是隐藏的对象的指针,因此静态成员函数没有this 指针。

静态成员函数当在类外定义时,要注意不能使用static关键字作为前缀。

由于静态成员函数在类中只有一个拷贝(副本),因此它访问对象的成员时要受到一些限制:静态成员函数可以直接访问类中说明的静态成员,但不能直接访问类中说明的非静态成员;若要访问非静态成员时,必须通过参数传递的方式得到相应的对象,再通过对象来访问。

2. 在类的定义中,用于为对象分配内存空间,对类的数据成员进行初始化并执行其他内部管理操作的函数是()A. 友元函数B. 虚函数C. 构造函数D. 析构函数答案:C解析:(P75)定义构造函数作用就是初始化对象,而析构函数释放对象空间。

虚函数用于完成多态性,友元增加访问方便性。

3. 所有在函数中定义的变量,都是()A. 全局变量B. 局部变量C. 静态变量D. 寄存器变量答案:B解析:(P136)变量存储类可分为两类:全局变量和局部变量。

(1)全局变量:在函数外部定义的变量称为全局变量,其作用域为:从定义变量的位置开始到源程序结束。

全局变量增加了函数之间数据联系的渠道,全局变量作用域内的函数,均可使用、修改该全局变量的值,但是使用全局变量降低了程序的可理解性,软件工程学提倡尽量避免使用全局变量。

(2)局部变量:在函数内部定义的变量称为局部变量,其作用域为:从定义变量的位置开始到函数结束。

C++学习之路—运算符重载(二)运算符重载作为类的成员函数和友元函数

C++学习之路—运算符重载(二)运算符重载作为类的成员函数和友元函数

C++学习之路—运算符重载(⼆)运算符重载作为类的成员函数和友元函数对运算符重载的函数有两种处理⽅式:(1)把运算符重载的函数作为类的成员函数;(2)运算符重载的函数不是类的成员函数,在类中把它声明为友元函数。

1 把运算符重载函数作为类的成员函数例1:为了便于说明问题,将重载函数的定义重写如下:1: Complex Complex :: operator + ( Complex& c2 )2: {3: Complex c ;4: c.real = real + c2.real ;5: c.imag = imag + c2.imag ;6:return c ;7: }有⼈可能会提出这样的疑问:“+”是双⽬运算符,为什么重载函数只有⼀个参数呢?实际上,运算符重载函数应当有两个参数,但是,由于重载函数是Complex类中的成员函数,因此有⼀个参数是隐含的,运算符函数是⽤this指针隐式的访问类对象的成员。

可以看到operator+访问了两个对象中的成员,⼀个是this指针指向的对象中的成员,⼀个是形参对象中的成员。

2 把运算符重载函数作为类的友元函数运算符重载函数除了可以作为类的成员函数外,还可以是⾮成员函数。

在有关的类中把它声明为友元函数,即友元运算符重载函数。

例2:将运算符+重载为适⽤于复数加法,重载函数不作为成员函数,⽽放在类外,作为Complex类的友元函数。

1:class Complex2: {3:public:4: ...5:friend Complex operator + ( Complex& c1 , Complex& c2 ) ; //重载函数作为友元函数6:private:7:double real ;8:double imag ;9: };10:11: Complex operator + ( Complex& c1 , Complex& c2 ) //定义运算符+重载函数12: {13: Complex c ;14: c.real = c1.real + c2.real ;15: c.imag = c1.imag + c2.imag ;16:return c ;17: }这个程序和把运算符重载函数作为类的成员函数相⽐,只做了⼀处改动,就是将运算符重载函数作为类外的普通函数,并在Complex类中声明它为友元函数。

C++程序设计04737 第4章 运算符重载

C++程序设计04737 第4章 运算符重载

//成员函数
myComplex &operator=(double);
//成员函数 };
myComplex::myComplex(){ real=0;imag=0;}
myComplex::myComplex(double r,double i)
{real=r;imag=i;}
myComplex myComplex::addCom(myComplex c1) {return myComplex(this->real+c1.real,this->imag+c1.imag); } void myComplex::outCom(){cout<<"("<<real<<","<<imag<<")";} void myComplex::outCom(string s) {cout<<s<<"=("<<real<<","<<imag<<")"<<endl;} void myComplex::changeReal(double r) {this->real=r;} myComplex operator+(const myComplex &c1,const myComplex &c2) //c1+c2 {return myComplex(c1.real+c2.real,c1.imag+c2.imag);}//返回一个临时对象 myComplex operator+(const myComplex &c1,double r) //c1+r {return myComplex(c1.real+r,c1.imag);} //返回一个临时对象 myComplex operator+(double r,const myComplex &c1) //r+c1 {return myComplex(r+c1.real,c1.imag);} //返回一个临时对象 myComplex operator-(const myComplex &c1,const myComplex &c2)//c1-c2 {return myComplex(c1.real-c2.real,c1.imag-c2.imag);}//返回一个临时对象 myComplex operator-(const myComplex &c1,double r) //c1-r {return myComplex(c1.real-r,c1.imag);//返回一个临时对象} myComplex operator-(double r,const myComplex &c1) //r-c1 {return myComplex(r-c1.real,-c1.imag); //返回一个临时对象} myComplex &myComplex::operator=(const myComplex &c1) {this->real=c1.real;this->imag=c1.imag;return *this; } myComplex &myComplex::operator=(double r) {this->real=r;this->imag=0;return *this;}

简述运算符重载的规则。

简述运算符重载的规则。

简述运算符重载的规则。

运算符重载是C语言中的一种语法特性,允许程序员在函数内部重载运算符,以改变其操作类型和参数类型。

运算符重载可以用于实现一些复杂的逻辑,也可以用于提高代码的灵活性和可重用性。

运算符重载的规则如下:
1. 运算符重载只能重载算术运算符和逻辑运算符,不能重载关系运算符(如+、-、*、/等)。

2. 运算符重载的重载点必须在函数内部,不能跨越函数调用。

3. 运算符重载的参数类型必须与运算符的类型相同或相似,且参数类型之间的运算符必须兼容。

4. 运算符重载的函数必须声明在头文件中,并且必须在文件定义之前声明。

5. 运算符重载的函数可以重载多个运算符,但是不能重复重载同一个运算符。

6. 运算符重载的函数可以修改原始运算符的行为,比如将一个算术运算符重载为逻辑运算符。

7. 运算符重载的函数可以改变运算符的顺序,比如将一个逻辑运算符重载为算术运算符。

8. 运算符重载的函数可以改变运算符的优先级,比如将一个逻辑运算符重载为算术运算符或者赋值运算符。

通过运算符重载,程序员可以实现一些复杂的逻辑,比如将一个算术运算符重载为逻辑运算符,以进行条件判断和流程控制。

运算符重载还可以提高代码的
灵活性和可重用性,因为不同的函数可以分别实现不同的逻辑,而不必共享相同的代码。

除了常见的算术运算符重载和逻辑运算符重载外,C语言还支持一些其他的运算符重载,比如字符串比较运算符重载、字符串拼接运算符重载等。

程序员可以根据具体的需求和场景,灵活地使用运算符重载来实现不同的逻辑。

运算符重载详解

运算符重载详解

运算符重载详解1.运算符重载定义:C++中预定义的运算符的操作对象只能是基本数据类型。

但实际上,对于许多⽤户⾃定义类型(例如类),也需要类似的运算操作。

这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够⽤于特定类型执⾏特定的操作。

运算符重载的实质是函数重载,它提供了C++的可扩展性,也是C++最吸引⼈的特性之⼀。

运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进⾏的操作。

运算符函数的定义与其他函数的定义类似,惟⼀的区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的。

运算符函数定义的⼀般格式如下:<返回类型说明符> operator <运算符符号>(<参数表>){<函数体>} 2.运算符重载时要遵循以下规则:(1) 除了类属关系运算符"."、成员指针运算符".*"、作⽤域运算符"::"、sizeof运算符和三⽬运算符"?:"以外,C++中的所有运算符都可以重载。

(2) 重载运算符限制在C++语⾔中已有的运算符范围内的允许重载的运算符之中,不能创建新的运算符。

(3) 运算符重载实质上是函数重载,因此编译程序对运算符重载的选择,遵循函数重载的选择原则。

(4) 重载之后的运算符不能改变运算符的优先级和结合性,也不能改变运算符操作数的个数及语法结构。

(5) 运算符重载不能改变该运算符⽤于内部类型对象的含义。

它只能和⽤户⾃定义类型的对象⼀起使⽤,或者⽤于⽤户⾃定义类型的对象和内部类型的对象混合使⽤时。

(6) 运算符重载是针对新类型数据的实际需要对原有运算符进⾏的适当的改造,重载的功能应当与原有功能相类似,避免没有⽬的地使⽤重载运算符。

(7)重载运算符的函数不能有默认的参数,否则就改变了运算符的参数个数,与前⾯第3点相⽭盾了;(8)重载的运算符只能是⽤户⾃定义类型,否则就不是重载⽽是改变了现有的C++标准数据类型的运算符的规则了,会引会天下⼤乱的;(9)⽤户⾃定义类的运算符⼀般都必须重载后⽅可使⽤,但两个例外,运算符“=”和“&”不必⽤户重载;(10)运算符重载可以通过成员函数的形式,也可是通过友元函数,⾮成员⾮友元的普通函数。

C++练习题2答案

C++练习题2答案

填空题1. 根据访问权限的不同,可将类的成员分为三类____公有____ 、__私有_____ 和__保护______。

2.静态函数成员可直接引用该类的___静态数据成员_________ 和函数成员,而不能直接引用_____非静态数据成员___________ 。

3.静态成员属于__类____ ,而不属于_____对象______ ,它被同一个类的所有对象共享。

4.重载运算符的含义必须清楚,不能有_二义性________ 。

5.给出C++中以下英文单词的中文意思:OOP_____面向对象编程_________,OOA____面向对象分析__。

6. C++中的多态性是指具有不用功能的函数可以使用同一个___函数名___。

7.一个对象所占的空间的大小只取决于该对象中__数据成员__所占的空间,而与_成员函数____无关。

8.面向对象程序设计的四个主要特点为:_封装___、抽象____、继承和多态。

9.多态性是通过_调用函数_来实现的,动态多态性是通过__虚函数__ 来实现的。

10.C++提供的______继承____________机制允许一个派生类继承多个基类。

11.每个对象都有一个指向自身的指针,称为this__ 指针,通过使用它来确定其自身的地址。

12.当通过基类指针___ 或_____引用_ 使用虚函数时,C++会在与对象关联的派生类中正确的选择重定义的函数。

13.C++的动态多态性是通过虚函数实现的。

14.为了解决程序中函数调用的效率问题,引入了__内置函数______,定义时需在函数前面加上__inline______说明;为了提高程序的运行效率,引入了_寄存器_______,定义时需在函数前面加上___register_____说明。

15.在类的定义当中,缺省的成员是___实参_____成员。

16.当一个成员函数被调用时,该成员函数的_____t his指针_________指向调用它的对象。

c++试题库(整理)

c++试题库(整理)

2009-2010学年第二学期计算机系《面向对象程序设计C++》期末考试试卷(B卷)一、填空题1.在说明引用时用const修饰的引用为常引用,它所引用的对象不允许更改。

2.信息隐藏是指将对象的数据和操作隐藏起来的技术。

3.运行时多态性主要是通过虚函数来实现的。

4.类的对象成员的构造函数的调用次序取决于这些对象成员在类中声明的次序,与它们在初始化列表中出现的次序无关。

5.拷贝构造函数是一种特殊的构造函数,其形参是本类对象的引用;其作用是使用一个已经存在的对象去初始化另一个同类的对象。

6.在C++中,可以通过在运算符函数参数表中是否插入关键字int来区分前缀和后缀这两种方式。

7.构造函数是一种特殊的成员函数,它主要用来为对象分配内存空间,对类的数据成员进行初始化并执行对象的其他内部管理操作。

8.如果在一个类中说明了常数据成员,那么构造函数就只能通过成员初始化列表对该数据成员进行初始化, 任何其他函数都不能对该成员赋值。

9.联编是指将函数调用与相应函数体代码彼此关联的过程。

若此过程在程序开始运行前的编译时完成,则称之为静态联编。

10.一个非成员函数必须声明为一个类的friend 才有可能存取该类的私有数据成员。

二、判断题1.如果类中含有指针类型的数据,深拷贝就会产生错误。

(╳)2. 类模板不是代表一个具体的、实际的类, 而是代表着一类类。

(√)3. 常常用将类的下标运算符[ ] 重载为友元函数。

(╳)4. 类类型转换函数既没有参数, 也不显式给出返回类型。

(√)5. 动态联编在程序运行阶段完成的联编。

(√)6. 编译时多态性主要是通过函数重载和运算符重载实现的。

(√)7. C++中的类属关系运算符“.”也可以重载。

(╳)8. 构造函数的名字必须与类名相同,其返回类型缺省为void类型。

(╳)9. 允许将一个声明为指向派生类对象的指针指向其基类的一个对象。

(╳)10. 常对象只能调用它的常成员函数, 而不能调用普通的成员函数。

构造函数的作用是在创建对象时

构造函数的作用是在创建对象时
都可以用于函数参数和返回值。
二,对象数组
1.定义格式:
2.对象数组元素:
3.区别:指向对象数组的指针和对象指针数组。
三,子对象和堆对象
子对象概念:一个对象作为另一个类的成员时,该对象称为类的子对象。子对象实际是某类的数据成员。
堆对象:在程序运行中,根据需要随时创建的对象称为堆对象。
C++中,内存被分为4种储存区域:
该运算符必须用于由new返回的指针。
对于一个指针只能使用一次运算符delete。
指针名前只能使用一对方括号,而不管所释放数组的为数,并且方括号内不写任何东西。
该运算符也适应于空指针。
四,类型转换和转换函数
类型转换包括隐含类型转换和强制类型转换。转换函数是一种强制类型转换。
单参数的构造函数,提供了一种功能,可以将其他数据类型的数值或变量转换为用户所定义的数据类型。这便是单参数构造函数所具有的类型转换功能。
动态联编:指在程序运行时进行的联编,又称晚期联编。
继承是动态联编的基础,虚函数是动态联编的关键。
三,动态联编的条件
公有继承
虚函数
引用虚函数的方法:对象引用和对象指针、成员函数。
虚函数的特性:
派生类中的虚函数与基类中的虚函数具有相同的参数个数、对应的参数类型,相同的返回值类型。
基类中说明的虚函数具有自动向下传给他的派生类的性质。即派生类的虚函数中的virtual说明可以省略。
基类构造函数。
子对象构造函数。
派生类构造函数。
派生类析构函数的调用顺序:
先调用派生类的析构函数。
在调用派生类中子对象的析构函数。
最后调用基类的析构函数。
在基类中定义有默认构造函数或者没有定义任何构造函数时,派生类构造函数中省略对基类构造函数的调用。

构成重载的条件

构成重载的条件

构成重载的条件函数重载是指在一个类中定义多个同名函数的行为,每个函数具有不同的参数组合和/或不同的参数类型。

这种编程技术可以使开发人员编写更加灵活、可适应多种场景的代码,并且还可以提高程序的复用性。

但是要实现函数重载,必须满足一定的条件。

下面将从函数名、参数个数、参数类型等不同角度,详细讲解构成重载的条件。

一、函数名相同函数重载的第一个条件是函数名相同。

如果一个类中有两个同名函数,而它们的参数个数或类型不同,那么这就是函数重载。

但是需要注意,函数名相同只是条件之一,并不意味着两个函数一定可以重载,因为函数名相同可能会造成编译器混淆函数意义的情况,所以必须满足其他条件。

二、参数个数不同函数重载的第二个条件是参数个数不同。

也就是说,如果在同一个类中定义了相同的函数名,但是它们的参数个数不同,那么它们就可以构成重载。

比如,在一个类中可以定义这样两个函数:```c++void foo(int x);void foo(int x, int y);这两个函数的函数名相同,但是参数个数不同,因此它们可以重载。

但是需要注意,参数个数相同但是参数类型不同的函数不能构成重载。

三、参数类型不同函数重载的第三个条件是参数类型不同。

也就是说,如果在同一个类中定义了参数个数相同但是参数类型不同的函数,那么它们也可以构成重载。

比如,在一个类中可以定义这样两个函数:```c++void bar(int x);void bar(double x);```这两个函数的参数个数相同,但是参数类型不同,因此它们可以重载。

需要注意的是,如果只是参数类型的const或volatile修饰不同,并不能构成重载。

四、参数类型顺序不同函数重载的第四个条件是参数类型的顺序不同。

也就是说,如果在同一个类中定义了参数类型相同但是顺序不同的函数,那么它们也可以构成重载。

比如,在一个类中可以定义这样两个函数:```c++void foobar(int x, double y);void foobar(double y, int x);```这两个函数的参数类型相同,但是顺序不同,因此它们也可以重载。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
F f4(4,12);
cout<<f3<<endl;
cout<<F::maxcd(9,6)<<endl;
cout<<f3+f4<<endl;
cout<<f3*f2<<endl;
return 0;
}
常量和临时值必须要用const
2.临时对象
如果对象变量只用到一次,就直接用匿名对象,编译器可以对匿名对象进行优化,减少对象的创建 ,提高效率。
bool age;
double salary;
date birth;
Person(){cout<<"创建Person对象在"<<this<<endl;}
~Person(){cout<<"释放Person对象在"<<this<<endl;}
};
bool F::operator!()const
{
return (n==0); //或者return !n;
}
int main()
{
F f1; //输出0/1
F f2(3); //3传递给第一个参数,结果是3/1
F f3(6,12); //结果是6/12
{
if(d==0) throw "分母不能为0";
if(d<0) this->d=-d,F::n=-n;
reduce();
cout<<"F("<<n<<'/'<<d<<")\n";
}
/* 静态成员函数 */
static int maxcd(int a,int b) //求最大公约数
{
if(a==0) return b;
return maxcd(b%a,a);
}
friend ostream& operator<<()
{
o<<f.n<<'/'<<f.d;
return o;
cout<<"====================="<<endl;
return 0;
}
结果是:
创建陈宗权老师
复制陈宗权
创建UC老师杨强
===================
创建咨询老师徐微微
辞退咨询老师徐微微
====================
}
/*加号运算符重载*/
friend F operator+(const F& lh,const F& rh)
{
/*匿名对象*/
return F (lh.n*rh.d+lh.d*rh.n,lh.d*rh.d);
}
F operator*(const F& rh)const //重载时,成员比友元少一个形参,成员里当前对象作 为第一个操作数
delete[] men;
men=new Tቤተ መጻሕፍቲ ባይዱrh.max];
len=rh.len;
max=rh.max;
for(uint i=0;i<len;i++)
men[i]=rh.men[i];
return *this;
}
};
int main()
辞退UC老师杨强
辞退咨询老师徐微微
辞退陈宗权
3.例子
struct date{
int year;
int month;
int day;
};
struct Person{
string name;
int age;
1.静态成员函数不属于某个对象,只是属于一个类,也不能被this调用
三目运算符 ? :不能重载
. 也不能重载
= -> [] () (类型转换) 这些运算符只能用成员函数来重载
()是个函数对象,必须是成员
#include<iostream>
using namespace std;
当默认的等号运算符不能满足需要时
拷贝对象时对象里有指针,所以要自己去重载默认的拷贝构造函数
后++可以重载
前++重载时,要多一个int参数,参数一般默认为0
例子: 强制类型转换重载函数
class F
{
int n;
int d;
public:
F(int n=0,int d=1):n(n),d(d) { }
如果可能尽量使用临时对象。临时对象会及时释放
关于匿名对象的例子:
class Teacher
{
string name;
string course;
public:
Teacher(const char* n,const char* c):name(n),course(c)
cout<<endl;
}
~Stack()
{
delete[] men;
}
/*等号运算符的重载 */
Stack& operator=(const Stack& rh)
{
if(this=&rh)
return *this; //可以自己给自己赋值
class F{
int n;
int d;
void reduce(){
int mcd=maxcd(n<0?-n:n,d)
if (mcd!=1) n/=mdc,d/=mcd;
}
public:
F(int n=0,int d=1):n(n),d(d)
~autoptr() {cout<<cnt<<':'<<endl; if(--cnt==0) delete p; }
/*重载->运算符*/
Person* operator->(){return p} //访问谁的成员,就返回谁的地址
/*重载星号运算符*/
{
/*匿名对象*/
return F (n*rh.n,d*rh.d);
}
friend F operator~(const F& f)
{
return F(f.d,f.n);
}
bool operator!()const;
};
friend F& operator--(F& f){ f.d-=f.d;return f; }
friend F operator--(F& f,int){ F old(f); f.n-=f.d; return old; }
operator double() //类型转换运算符返回类型可以省略
autoptr b=a; //t==2
autoptr c=a; //t==3
cout<<a->age<<endl;
a->name="芙蓉";
cout<<(*a).name<<endl;
}
4.单例模式
typedef string T;
{
return 1.0*n/d;
}
operator bool()
{ return n!=0; }
};
void func1(F a) { cout<<a<<endl; }
uint max_size()const
{ return max; }
uint size()const
{ return len; }
Stack& push(const T& e)
{
if(len>=max)
throw 1;
men[len++]=e;
//用临时对象来初始化一个新对象,编译器一般会优 化成直接用创建临时对象的参数来创建新对象
t2=t3; //赋值
cout<<"================="<<endl;
t2=Teacher("徐微微","咨询"); //临时对象会及时释放
return *this;
}
T pop()
{
if(len==0)
throw 0;
return men[--len];
}
void print()const
{
for(uint i=0;i<len;i++)
cout<<men[i];
{
cout<<"创建"<<course<<"老师"<<name<<endl;
}
Teacher(const Teacher& t):name(),course(t.course)
{
cout<<"复制"<<course<<"老师"<<name<<endl;
相关文档
最新文档