欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

函数对象与复制构造函数

程序员文章站 2022-03-30 20:23:03
``` // // main.cpp // functionObj // 函数对象 // 1.函数调用运算符(),这个运算符支持重载。 // 2.()运算符能够返回任何类型,可以使用任何数量的参数,但是跟赋值运算符一样,只能重载为成员函数。 // 3.函数对象也是对象,只是他的行为表现的像函数而已。 ......
//
//  main.cpp
//  functionobj
//  函数对象
// 1.函数调用运算符(),这个运算符支持重载。
// 2.()运算符能够返回任何类型,可以使用任何数量的参数,但是跟赋值运算符一样,只能重载为成员函数。
// 3.函数对象也是对象,只是他的行为表现的像函数而已。当调用函数对象时,其参数是函数调用运算符的参数
// 4.复制构造函数仅在创建对象并初始化对象时才起作用。特别需要注意的是,复制构造函数(而不是赋值构造函数,注意区分)不能在赋值中调用。
// 5.复制构造函数是一个特殊的构造函数,无论何时创建一个新对象并使用同一个类的另一个对象的数据对他进行初始化时,都会调用该构造函数。
// 6.如果程序员没有为某个类指定一个复制构造函数,那么编译器会自动调用一个默认复制构造函数(default copy constructor)
// 这个默认的复制构造函数只是使用按成员赋值方式将现有对象的数据复制到新对象中。
// 7.默认的复制构造函数执行的按成员赋值操作将第一个对象指针的值复制到第二个对象的指针中,从而导致两个指针指向相同的数据。
//  因此,当其中一个对象通过其指针改变其数据时,他会影响到另一个对象。
// 注意:两个指针指向同一个内存位置,这一事实还将导致更严重的问题。例如,两个对象的析构函数有可能试图释放相同的内存。
//  验证一下指针跟数组之间的关系
//  created by mac on 2019/4/11.
//  copyright © 2019年 mac. all rights reserved.
//

#include <iostream>
using namespace std;

class classf{
public:
    classf(){
        
    }
    ~classf(){
        
    }
    //运算符重载
    double operator ()(double x){
        return 2*x;
    }
};

double sum2(classf f,int n,int m){
    double result=0;
    for (int i=n; i<=m; ++i) {
        result+=f.operator()(i); //常规写法
        //还有一种简写方式 对象+(参数) 这样看起来就特别像是一个函数调用了。
        // result+=f(i);
    }
    return result;
}


int main(int argc, const char * argv[]) {
    classf cf;
    cout<<sum2(cf, 2, 5)<<endl; //第一种写法,参数一一对应
    cout<<sum2(classf(), 2, 5)<<endl;   // 传入一个构造函数classf()
    
    //验证数组与指针之间的关系
    double *p=nullptr;
    //数组跟指针真的是同一个东西 指针变量直接就当数组名用 根本就不需要提前用指针去指向什么!
    for (int i=0; i<10; i++) {
        p=new double(1);
        p[i]=i;
    }
    
    return 0;
}

运行结果

28
28
program ended with exit code: 0