精华内容
下载资源
问答
  • 常成员函数只能被常对象调用
    千次阅读
    2020-03-30 15:36:30

    引发原因: 由调用成员函数时隐式传入的当前对象的this指针引起。
    1、 非const成员函数中的隐式参数:classA* this
    2、 const成员函数中的隐式参数:const classA* this

    根本原因:
    1、 const对象的指针为const classA* this,因此传入非const成员函数时编译器报错(类型不匹配,无法从const 指针转换为非const指针);但传入const成员函数则类型匹配。

    2、非const对象的指针为classA* this,可以调用const成员函数,因为const修饰符保证了不会修改该对象。

    详细代码案例解释见:为什么const对象只能调用const成员函数,而不能调用非const成员函数?

    总结:

    1、const对象只能调用const成员函数、不能调用非const成员函数;
    2、非const对象可以调用const成员函数。

    更多相关内容
  • 1. 常对象只能调用常成员函数。 2. 普通对象可以调用全部成员函数。 3. 当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含使用this指针。 4....
  • 对象只能调用常函数成员 c++

    千次阅读 2015-08-18 21:06:35
    关于 常对象只能调用常函数成员,不能调用非const 函数成员问题,我有点想法 就是我想到的一个角度来解释为什么。 你看,常函数成员的特性就是要在函数后面加一个const 修饰关键字 以 int getX() const;为例,,...


    关于 常对象只能调用常函数成员,不能调用非const 函数成员问题,我有点想法


    就是我想到的一个角度来解释为什么。

    你看,常函数成员的特性就是要在函数后面加一个const 修饰关键字

    以  int getX() const;为例,,将之作解析, 即, int getX(const Coordinate * this);
    这次我们重点看的不是 const 修饰谁的问题, 而是 this 的类型问题

    显然,这里的 this 的类型是 const Coordinate * 类型


    也就是说, 这个函数所需要接受的形参类型是 const Coordinate * 类型
    问题来了  const Coordinate * 类型 和 Coordinate * 类型,到底是什么关系,还是没有关系的两种类型???

    我想说的就是, 假定 const Coordinate * 和 Coordinate * 是两种类型
    因为 常对象的地址是const Coordinate * 类型,而成员函数调用的时候必须接收所在对象的指针
    也就是说,常对象中的成员函数必须接收常对象的地址,也就是 const Coordinate * 类型地址
    为此要符合类型的匹配,成员函数必须要用 const Coordinate * 类型的形参来接收,

    所以必须将成员函数修饰为 const ,即常对象函数 

    只有这样才能满足类型的匹配!!!


    void test()const 
    {
    cout << "jack is a good boy!!!" << endl;
    }


    void test ()
    {
    cout << "via via via " << endl;
    }


    /*这两个函数互为重载,可见  const Coordinate * 和 Coordinate *  确实不一样!!!*/ 

    Jack_Lu

    展开全文
  • //常对象只能调用常成员函数 people::people( const people& temp) temp是常对象 temp.getname(); temp.getage(); temp调用函数 getname(), getage()。 getname(), getage()必须是常...
    class A
    {
    public:  void print()const{ cout<<"No const";}
    void test() { print();}
    void test1() const {print();}  
    };
    int main(int argc, char* argv[])

    A a;
    a.print();
    a.test();
    a.test1();


       return 0;

    }


    void test1() const {print();}  常成员函数调用常成员函数,OK!

    如果改成如下:

    class A
    {
    public:  void print(){ cout<<"No const";}
    void test() { print();}
    void test1() const {print();}  
    };
    int main(int argc, char* argv[])

    A a;
    a.print();
    a.test();
    a.test1();


       return 0;
    }

    void test1() const {print();}  常成员函数调用非常成员函数

    则编译器会报错:

    1>e:\poj\poj 1080 human gene function\poj 1080 human gene function\poj 1080 human gene function.cpp(9): error C2662: “A::print”: 不能将“this”指针从“const A”转换为“A &”

    这个问题不是这样考虑的,常成员函数的对象只是只读访问,不允许修改对象的成员变量,所以不能调用非常成员函数,因为,这些成员函数可能修改成员变量。  而普通成员函数当然可以调用常成员函数
    class people 
    {
    private:
    char *name;
    int age;
    public:
    people(char *namestr,int i);
    people( const people& temp);
    ~people();
    char *getname()const;
    int getage()const;
    };
    people::people(char *namestr,int i)
    {   
    int len=strlen(namestr);
    name=new char[len+1];
    strcpy(name,namestr);
        *(name+len)='\0';
    age=i;
    }
    people::people( const people& temp)
    {
    char* tempName=temp.getname();
    int   tempAge=temp.getage();
    int len=strlen(tempName);
    name=new char[len+1];
    strcpy(name,tempName);
        *(name+len)='\0';
    age=tempAge;


    }
    people::~people()
    {
    delete name;
    }
    char *people::getname()const
    {
    return name;
    }
    int people::getage()const
    {
    return age;
    }
    void display(people  x)
    {
    cout<<"people\'s name: "<<x.getname()<<endl;
    cout<<"people\'s age: "<<x.getage()<<endl;
    }


    int main()
    {
    people p("xieyi",30);
    display(p);
    return 0;
    }

    //常对象只能调用常成员函数

    people::people( const people& temp)

    temp是常对象

    temp.getname();

    temp.getage();

    temp调用函数getname(),getage()。

    getname(),getage()必须是常成员函数

    char *getname()const;
    int getage()const;

    如果修改程序为:


    class people 
    {
    private:
    char *name;
    int age;
    public:
    people(char *namestr,int i);
    people( const people& temp);
    ~people();
    char *getname();
    int getage();
    };
    people::people(char *namestr,int i)
    {   
    int len=strlen(namestr);
    name=new char[len+1];
    strcpy(name,namestr);
        *(name+len)='\0';
    age=i;
    }
    people::people( const people& temp)
    {
    char* tempName=temp.getname();
    int   tempAge=temp.getage();
    int len=strlen(tempName);
    name=new char[len+1];
    strcpy(name,tempName);
        *(name+len)='\0';
    age=tempAge;


    }
    people::~people()
    {
    delete name;
    }
    char *people::getname()
    {
    return name;
    }
    int people::getage()
    {
    return age;
    }
    void display(people  x)
    {
    cout<<"people\'s name: "<<x.getname()<<endl;
    cout<<"people\'s age: "<<x.getage()<<endl;
    }


    int main()
    {
    people p("xieyi",30);
    display(p);
    return 0;
    }


    常成员函数意图调用非常成员函数:

    编译会出现如下的错误:

    e:\poj\poj 1080 human gene function\poj 1080 human gene function\poj 1080 human gene function.cpp(27): error C2662: “people::getname”: 不能将“this”指针从“const people”转换为“people &”
    1>          转换丢失限定符
    1>e:\poj\poj 1080 human gene function\poj 1080 human gene function\poj 1080 human gene function.cpp(28): error C2662: “people::getage”: 不能将“this”指针从“const people”转换为“people &”
    1>          转换丢失限定符


    展开全文
  • 1)const对象可以调用非const成员函数吗? 答:不能。const修饰的对象实则修饰的是该对象的this指针,并且const修饰的成员不能进行修改,如果使用const调用非const成员函数,可能会将const对象进行修改。 2)非...

    1)const对象可以调用非const成员函数吗?

    答:不能。const修饰的对象实则修饰的是该对象的this指针,并且const修饰的成员不能进行修改,如果使用const调用非const成员函数,可能会将const对象进行修改。

    2)非const对象可以调用const成员函数吗?

    答:可以,这里就是将一个可以修改的对象进行读取,是允许的。

    3)const成员函数内可以调用其它的非const成员函数吗?

    答:不允许,const成员函数调用非const成员函数,调用该const成员函数的对象已经被设置为const类型,只可以访问不能修改,在用该const成员函数访问其他非const成员函数可能会修改,因此const成员函数不能调用非const成员函数。

    4)非const成员函数内可以调用其它的const成员函数吗?

    答:允许,与非const对象调用const对象类似。

    展开全文
  • const对象只能调用const成员函数

    千次阅读 2019-07-13 22:38:52
    常量成员函数 (const member ...const对象是不可以调用类中的非const成员函数。原因之后解释。 假设现在有如下代码: class test{  int i; public:  void print();  test(int i); }; test obj1(12); obj1.p...
  • 一、const1、常对象只能调用常成员函数2、普通对象可以调用全部的成员函数包括常成员函数3、常方法不能调用普通方法 可以调用常方法、静态成员方法4、普通方法可以调用常方法解释:当一个成员函数被调用时,自动向它...
  • c++常对象常成员函数详解

    千次阅读 2017-07-15 21:52:19
    对象对象是指该对象在其生命周期内,其所有的数据成员的值都不能改变;定义对象时加上关键字const,该对象就是...1. 常对象只能调用常成员函数,不能调用普通成员函数 (除了隐式调用析构函数和构造函数),常成员
  • 数据成员: const 类型说明符 数据成员 如:const int year 常成员函数:类型说明符 函数名(参数表) const ...2.数据成员可以被常成员函数访问,也可普通成员函数访问。 3.如果将一个对象说明为一个常对象,...
  • 【C++】 常对象数据成员、常成员函数总结

    千次阅读 多人点赞 2019-03-24 15:07:25
    常数据成员  ◆ 常数据成员必须进行初始化,并且不能更新。  ◆ 常数据成员不能在声明时赋初始值(普通数据成员也是),常数据成员必须在构造函数初始化列表进行初始化;... ◆ ⭐常对象可以调用常成员函...
  • 为啥静态函数只能调用静态成员

    千次阅读 2020-06-25 23:04:54
    因此,静态成员是类的所有对象中共享的成员,而不是某个对象成员。 使用静态数据成员可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值...
  • 在c++中,我们可以用const来定义一个const对象,const对象是不可以调用类中的非const成员函数,这是为什么呢?下面是我总结的一些原理。假设有一个类,名字为test代码如下: 1 class test{ 2 int i; 3 public: 4 ...
  • 通过函数指针调用一个函数的时候,此函数必须有具体的地址,因此当调用一个类成员函数的时候,此成员函数必须声明为static,即静态成员函数,这样就能通过函数指针获取到成员函数的地址,进而调用
  • class A { }; /*小记:对于const声明的对象,针对哪个变哪个不变得问题,实际上就是... //const修饰指向的对象,A可变,A指向的对象不可变 int *const A; //const修饰指针A, A不可变,A指向的对象可变 const in
  • 1、在子类内部不能调用父类中私有的成员函数只能调用受保护和公有的成员函数。 2、在子类外部,子类对象按照继承方式重新给父类成员函数赋予访问权限(上面是 public 继承),此时只有重新赋予的访问权限是 ...
  • 1.成员变量:成员变量是用关键字const来声明的变量,const位于变量前或者类型前都一样,用const修饰的变量只能...注明:常成员函数只能通过构造函数的初始化表对其进行初始化,成员变量所在类中所有的构造函数...
  • C++类static成员函数调用

    千次阅读 2021-10-13 18:08:31
    另外,静态成员函数只能访问对应类内部的静态数据成员,否则会出现编译错误,下面举个例子来描述下。 class box{ private: int _non_static; static int _static; public: int a(){ return _no...
  • 不能通过常对象调用普通成员函数,但是可以通过普通对象调用常成员函数。常对象只能调用常成员函数。常对象的声明如下: const <类名> <对象名><类名> const <对象名> 两种声明完全一样没有任何区别...
  • const对象可以调用非const成员函数吗? 非const对象可以调用const成员函数吗? const成员函数内可以调用其它的非const成员函数吗? 非const成员函数内可以调用其他的const成员函数吗? 二、实践出真知 实践发现: ...
  • [c++] 常成员函数

    千次阅读 多人点赞 2020-02-19 12:42:25
    成员函数声明: 返回类型 成员函数名(参数表) const ; 例如: int function(int x) const ; 常成员函数的主要特点: ...4)常对象只能调用常成员函数,而不能调用其他的成员函数。 例子1: cla...
  • C++ 常函数常对象

    千次阅读 2020-02-12 14:33:20
    函数可以普通对象或者常对象调用 常对象不能调用所有普通函数 常对象只能调用常函数函数和常对象 常函数函数声明方式 返回值 函数名称 (参数) const; class Person : p...
  • C++ 类成员函数调用

    千次阅读 2019-04-21 22:39:49
    今天看了一篇写得很好的博客:类成员函数调用分析 看完后,有一些小的心得,大概是帮我理了一遍吧。 全局变量和static变量存放在静态存储区。 与静态成员变量和非静态成员变量不同的是:静态成员函数和非静态...
  • C++(常函数常对象

    千次阅读 2022-04-25 17:31:53
    对象只能调用常函数,但是普通对象既可以调用普通函数也可以调用常函数 class car { public: //常函数的const加在大括号之前,本意是在普通函数的this指针前加const, //形成const car* const c这样的结构,...
  • 对象指针为NULL,为什么还是可以调用成员函数

    千次阅读 多人点赞 2017-03-05 19:53:46
    C++中,空指针是不能够使用的,然而空对象指针有时候却能够调用成员函数。 先来看一下以下程序: #include #include using namespace std; class A { public: static void f1(){ cout; } void f2(){ cout; } void...
  • (1)下面这个错误的意思是我在我的非const成员中调用了const成员函数,这是会报错的!!!! In file included from circularListWithHeader.cpp:1:0: circularListWithHeader.h: In instantiation of ‘T& ...
  • 在学习const修饰的对象时,我们...在一个对象调用构造函数时,会隐含一个新参this指针。 也就是说,当我们定义了一个类(A)的非const类型的成员函数为A::Fun()。 实际上在编译器中该函数的定义是A::Fun(A* con...
  • 引用 形式—— const 类型 &对象名或变量名 ②常对象 ...3.常对象可以调用静态成员函数常成员函数,其实也可以调友元函数 (但是这里不对每一个具体展开了,就只是为了更加明白常对象是不
  • 1.const对象可以调用非const成员函数吗? 2.非const对象可以调用const成员函数吗? 3.const成员函数内可以调用其它的非const成员函数吗? 4.非const成员函数内可以调用其它的const成员函数吗? 总结 调用的...
  • 本文主要介绍C++回调函数中调用类中的非静态成员变量或非静态成员函数 回调函数中调用类中的非静态成员变量或非静态成员函数 【问题】如何在类中封装回调函数? a.回调函数只能是全局的或是静态的。 b.全局函数会...
  • 3)常成员函数不能更新类的成员变量,也不可以调用类中没有用const修饰的成员函数只能调用常成员函数,但是可以其他成员函数调用; 4)特别地:常对象只能访问类中const成员函数(除了系统自动调用的

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 360,695
精华内容 144,278
热门标签
关键字:

常成员函数只能被常对象调用