Qt:call to non-static member function without an object argument

1060 篇文章 295 订阅
本文详细解释了在C++中调用非静态成员函数时为何需要实例化对象,通过实例展示了错误的调用方式及修正方法。区分了静态成员函数与非静态成员函数的使用场景,强调静态函数适用于表示类的共享特性,而非静态函数则对应对象的特有属性。文章最后提供了如何根据函数意义选择合适方法的指导原则。
摘要由CSDN通过智能技术生成

在这里插入图片描述
错误:调用不带对象参数的非静态成员函数。
原因:类没有实例化 。


举个栗子,①例如:

 // 自定义了一个类Student,里面有个函数getAge()
 class Student
 {
 public:
       int getAge();
 };

出现这个错误的原因,也许是你在调用函数getAge()的时候这样操作:

 Student::getAge();

或者这样操作:

  Student.getAge();

改正方法一:先实例化一个对象

 Student XiaoWang; //先实例化一个对象小王
 int age = XiaoWang.getAge();
 // 这样就对啦,先把类Student实例化成一个具体的对象XiaoWang小王,再调用函数getAge()得到小王的年龄

改正方法二:把成员函数声明成静态函数

 class Student
 {
 public:
       static  int getAge(); // 声明成了静态函数
 };
 
 // 然后你就可以这样不实例化类,直接调用函数了:
 Student::getAge();
 // 静态成员函数就可以直接用“ `类::函数名`”调用。
 

静态成员函数就可以直接用“ 类::函数名”调用,无需实例化。

下面我们来分析一下为什么可以这样改

(1)为什么要实例化

  • 仍然以上面的类Student为例。类Student表示学生,这是一个抽象的概念,表示的是所有学生。实例化一个对象Student XiaoWang;,这个对象表示的是具体的学生小王,你还可以实例化别的对象比如小张、小刘、小李、小周、小赵等等,这些对象都是具体的某个学生。

  • 类的成员函数getAge()的意思是得到学生的年龄,我们最直观的理解就是,学生的年龄那肯定是某一个具体的学生的年龄,如果你用Student.getAge()的方法调用年龄函数,那究竟得到的是哪个学生的年龄呢?所以对于这种非静态成员函数,我们要实例化一个对象比如学生小王,我们调用XiaoWang.getAge()得到的就是小王的年龄。

(2)为什么调用静态函数不需要实例化

  • 仍然以上面的类Student为例。如果现在我们要得到所有学生的平均年龄该怎么办呢?假如现在类Student里增加了一个函数getAverageAge(),我们想得到所有学生的平均年龄,难道还要先实例化一个对象表示具体的学生,再通过这个对象得到平均年龄吗?

  • 所有学生的平均年龄,是学生类Student的一个共同特点,我们可以把得到平均年龄函数声明成静态函数,static int getAverageAge();,然后无需实例化对象,直接通过Student::getAverageAge();的方式调用。

  • 类的静态函数表示的是这个类的一个共同特点,静态函数是类的所有对象所共享的,不是某一个对象特有的,就像平均年龄是所有学生所共有的而不是某个学生所特有的,因此,静态函数不需要实例化对象,直接通过类名::函数名的方式就能调用。

因此,在选择用上面两种方法中的哪一种方法的时候,需要根据你写的函数的意义。

  • (1)如果你写的函数表示的是对象特有的特性,比如学生的年龄函数,用第一种方法,实例化对象再调用函数,更好。
  • (2)如果你写的函数表示的是这个类的所有对象共享的特性,比如所有学生的平均年龄函数,用第二种方法,将该函数声明成静态函数,更好。
    当然用哪种方法都可以,只是说用对场景更好。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值