相关文章推荐

函数名由 operator 加上重载运算符组成

参数:友元函数(一般是全局函数作友元)时,两个参数。 成员函数 一个参数。

以加号重载为例: 友元函数的隐式调用是 对象一 ➕对象二, 显式调用是 operator (对象一,对象二)

成员函数的隐式调用是 对象一 ➕对象二, 显式调用是 对象一. operator (对象二)

运算符重载的原则:

二.重载一个运算符原则:

1.不能改变运算符的初始意义。 (只是一种规范)

2.不能改变运算符的参数数目。如重载运算符+时只用一个操作数是错误的。

3.运算符函数不能包括缺省的参数。

4.绝大部分C++运算符都可以重载,除以下的例外:

. :: . ? *

5.除赋值运算符外,其它运算符函数都可以由派生类继承。

6.运算符重载不改变运算符的优先级和结合性,也不改变运算符的语法结构,即单目、双目运算符只能重载为单目、双目运算符。

加号运算符

《不可以作为左值(返回值为const),不可连续赋值(不返回对象引用)》

1-以成员函数形式重载

#include <iostream>
using namespace std;
class points
private:
    int x;
    int y;
public:
    points(int x, int y);
    void display();
    const points &operator+(const points &point) const;
points::points(int x = 0, int y = 0) : x(x), y(y){};
void points::display()
    cout << "x:   " << this->x << "y:     " << this->y;
const points &points::operator+(const points &point) const
    return points(this->x + point.x, this->y + point.y);
  //在原来的代码里面,表示引用的符号&暗示函数返回的是一个地址,但要注意points是一个临时变量,当函数体执行结束时,points的内存空间也随机消失了,而我们不能返回一个不存在的地址。
  // warning: returning reference to temporary [-Wreturn-local-addr]
int main()
    points p1(11, 33);
    points p2(44, 22);
    // points p3=p1+p2;
    points p3;
    p3 = p1 + p2;
    p3.display();

2-以友元函数重载

注意这里全局函数作友元时,重载函数不能为const函数。 在C++中CV指constvolatile1、非成员函数不能有CV限定,友元函数不是类的成员函数声明友元函数不能用const限定。 2、静态成员函数不能有CV限定 #include <iostream> using namespace std; class points private: int x; int y; public: points(int x, int y); void display(); friend const points operator+(const points &point1,const points &point2);//重载为成员函数 points::points(int x = 0, int y = 0) : x(x), y(y){}; void points::display() cout << "x: " << this->x << "y: " << this->y; const points operator+(const points &point1,const points &point2) //全局函数 return points(point1.x+point2.x,point2.y+point2.y); //在原来的代码里面,表示引用的符号&暗示函数返回的是一个地址,但要注意points是一个临时变量,当函数体执行结束时,points的内存空间也随机消失了,而我们不能返回一个不存在的地址。 // warning: returning reference to temporary [-Wreturn-local-addr] int main() points p1(11, 33); points p2(44, 22); // points p3=p1+p2; points p3; p3 = p1 + p2; p3.display(); //不能返回局部变量的指针或者引用 运算符重载的实质对象函数的调用写法函数返回值函数名(参数)函数返回值由运算完成后的值决定的函数名由operator加上重载运算符组成参数友元函数(一般是全局函数作友元)时,两个参数。成员函数一个参数。以加号重载为例友元函数的隐式调用是对象一➕对象二,显式调用是operator(对象一,对象二)成员函数的隐式调用是对象一➕对象二,显式调用是对象一.operator(对象二)运算符重载的原则..?*...
C++中,经常会对输入输出运算符进行重载,而在重载的时候用到了友元(Friends)和引用返回(Returning References),这里对为什么会这么用发表一些思考。 比如,下面的类是一个简单的Student类,其中重载了<<和>>。// // Created by lgl on 17-3-14. #include <iostream> #include <string>
iOS开发中我们会遇到各种警告,包括第三方不再支持更新导致的警告,苹果一些过时方法的警告,其中尤其是ASIHttpRequest的不支持更新导致有很多的警告,所以我在这里做了罗列 Semantic Warnings WarningMessage -WCFString-literal input conversion stopped due to an inpu...
当返回函数的零时量的引用的时候就会出现这种情况。 3.cc: In function ‘const string& add_(const string&, const string&, const string&)’: 3.cc:6:12: warning: reference to local variable ‘s’ returned [-Wreturn-local-addr] string s = s1;例如: #include <iostream...
当我在用C++编程时,遇到了warning: reference to local variable ‘tempreturned [-Wreturn-local-addr]的错误。 这是我出错的源代码。 #include <iostream> using namespace std; class Date int d, m, y; public: Date(i...
函数的返回值为函数内部定义变量的引用,但函数在调用完毕后,函数内部定义的变量空间被释放,无法访问,从而造成的错误。 Matrix& Matrix::operator+(const Matrix& rhs) Matrix result; //其他操作 return result; //改正方法一:给返回变量定义加上static限定符,保...
C++中,我们可以通过运算符重载来定义自定义的加法和减法运算符。运算符重载是指在类中定义一个函数,使得该函数可以在使用特定运算符时被调用。 以下是加法运算符重载的示例: ```cpp class Complex{ private: double real; double imag; public: Complex(double r = 0, double i = 0){ real = r; imag = i; Complex operator+(const Complex& c){ Complex res(real + c.real, imag + c.imag); return res; 在上面的示例中,我们定义了一个名为Complex的类,该类具有两个属性:real和imag,表示复数的实部和虚部。我们还定义了一个构造函数和一个加法运算符重载函数。加法运算符重载函数使用operator+作为函数名,并使用const Complex&作为参数。在函数体中,我们创建了一个新的Complex对象,将其实部和虚部初始化为当前对象和传入对象的实部和虚部的和,然后将该对象返回。 下面是减法运算符重载的示例: ```cpp class Complex{ private: double real; double imag; public: Complex(double r = 0, double i = 0){ real = r; imag = i; Complex operator-(const Complex& c){ Complex res(real - c.real, imag - c.imag); return res; 在上面的示例中,我们定义了一个名为Complex的类,该类具有两个属性:real和imag,表示复数的实部和虚部。我们还定义了一个构造函数和一个减法运算符重载函数。减法运算符重载函数使用operator-作为函数名,并使用const Complex&作为参数。在函数体中,我们创建了一个新的Complex对象,将其实部和虚部初始化为当前对象和传入对象的实部和虚部的差,然后将该对象返回。
在C++中,虚函数表(vtable)是在构造对象期间被初始化的。当创建一个类实例时,编译器会在对象内存布局的开始部分添加一个隐藏的指针(通常称为vptr),这个指针指向对应的虚表。 因此,说“在构造对象期间,虚函数表还没有被初始化”是错误的。实际上,在构造函数执行之前,vptr就已经被设置为指向正确的虚表了。这意味着即使在构造函数体内部也可以安全地调用虚函数,因为此时虚表已经存在并且可以正确地解析虚函数调用。 需要注意的是,每个类只有一个虚表,但每个类的实例都有自己的vptr。这是因为虽然所有的对象都共享同一个虚表,但是它们可能处于不同的继承层次,因此需要自己的vptr来指向正确的虚函数实现。
构造函数可以调用虚函数吗,析构函数可以调用虚函数吗(1) qq_45679006: 您好,“在构造对象期间,虚函数表还没有被初始化”是否写错了?
 
推荐文章