-
2019-03-10 10:38:40
常数据成员: const 类型说明符 数据成员 如:const int year
常成员函数:类型说明符 函数名(参数表) const 如:void showDate() const
1.常成员函数可以访问常数据成员,也可访问普通数据成员。
2.常数据成员可以被常成员函数访问,也可被普通成员函数访问。
3.如果将一个对象说明为一个常对象,则通过该对象只能调用它,而不能调用普通的成 员函数的成员函数。
4.常成员函数不能更新对象的数据成员,也不能调用该类中的普通成员函数。更多相关内容 -
普通成员函数、类成员函数和类静态成员函数实例(VS2010)
2017-12-26 19:56:46代码详解了普通成员函数、普通类成员函数和类静态成员函数的使用方法,已测试,可直接使用 -
C++ 一般(普通)函数指针、类成员函数指针,用法区别,以及强制转换
2020-07-03 15:57:47博文地址:https://blog.csdn.net/maoyeahcom/article/details/107106680 -
静态成员函数和普通成员函数的区别
2018-04-25 09:46:10成员函数:无论静态函数还是非静态函数,都是属于类的(这一点与数据成员的静态非静态不同),对象并不拥有函数的拷贝.两者的区别在于:非静态的函数由类对象(加.或指针加->;)调用,这时将向函数传递this指针.而静态...成员函数:无论静态函数还是非静态函数,都是属于类的(这一点与数据成员的静态非静态不同),对象并不拥有函数的拷贝.两者的区别在于:非静态的函数由类对象(加.或指针加->;)调用,这时将向函数传递this指针.而静态函数由类名(::)(或对象名.)调用,但静态函数不传递this指针,不识别对象个体,所以通常用来对类的静态数据成员操作.
程序最终都将在内存中执行,变量只有在内存中占有一席之地时才能被访问。
类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。
在一个类的静态成员中去访问其非静态成员之所以会出错是因为在类的非静态成员不存在的时候类的静态成员就已经存在了,访问一个内存中不存在的东西当然会出错。
C++会区分两种类型的成员函数:静态成员函数和非静态成员函数。这两者之间的一个重大区别是,静态成员函数不接受隐含的this自变量。所以,它就无法访问自己类的非静态成员。
静态数据成员
在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。
使用静态数据成员可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象 都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。
静态数据成员的使用方法和注意事项如下:
1、静态数据成员在定义或说明时前面加关键字static。
2、静态成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式如下:
<数据类型><类名>::<静态数据成员名>=<值>这表明:
(1) 初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆。(2) 初始化时不加该成员的访问权限控制符private,public等。
(3) 初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员。
3、静态数据成员是静态存储的,它是静态生存期,必须对它进行初始化。
4、引用静态数据成员时,采用如下格式:
<类名>::<静态成员名>
静态成员函数
静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员的引用不需要用对象名。
在静态成员函数的实现中不能直接引用类中说明的非静态成员,可以引用类中说明的静态成员。如果静态成员函数中要引用非静态成员时,可通过对象来引用。下面通过例子来说明这一点。#include <iostream> using namespace std; class M { public: M(int a) { A=a; B+=a;} static void f1(M m); private: int A; static int B; }; void M::f1(M m) { cout<<“A=”<<m.A<<endl; //静态成员函数中通过对象来引用非静态成员 cout<<“B=”<<B<<endl; } int M::B=0; //静态数据成员初始化的格式<数据类型><类名>::<静态数据成员名>=<值> void main() { M P(5),Q(10); M::f1(P); //静态成员函数调用时不用对象名 M::f1(Q); }
读者可以自行分析其结果。从中可看出,调用静态成员函数使用如下格式:
<类名>::<静态成员函数名>(<参数表>);
运行结果:
A=5
B=15
A=10
B=15
https://www.cnblogs.com/jianglei-tz/articles/static-member-function.html
-
C++普通函数,普通成员函数、静态成员函数的区别
2017-05-13 22:24:531普通函数:属于全局函数,不受具体类...普通成员函数本质上是一个包含指向具体对象this指针的普通函数,即c++类的普通成员函数都隐式包含一个指向当前对象的this指针。 例如:定义一个类: class myClass { publi1普通函数:属于全局函数,不受具体类和对象的限制,可以直接调用。
例如:
void printf()
{
printf("Hello World");
}
2普通成员函数:C++ 普通成员函数本质上是一个包含指向具体对象this指针的普通函数,即c++类的普通成员函数都隐式包含一个指向当前对象的this指针。
例如:定义一个类:
class myClass
{
public:
void myprint()
{
printf("m_a:%d",m_a);
}
private:
int m_a;
};
void main()
{
myClass A1(5);
A1.myprint();
}
在main函数里面调用普通成员函数:A1.myprint()等价于myprint(&A1)。这是因为c++编译器实现普通成员函数的时候,void myClass::myprint()的本质是普通函数void myprint(myClass *this);
3静态成员函数
首先介绍类的静态成员变量: 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。
静态成员变量的性质:
1)static型变量只被初始化一次,下次执行初始化语句会直接跳过。
2)static 说明一个类的成员为静态成员,经过static修饰的成员变量属于这个类,不再仅仅属于具体的对象。
再介绍静态成员函数: 类体中的成员函数的声明前加上static关键字,该成员函数就成为了该类的静态成员函数。
静态成员函数的性质:
1)不可以调用类的非静态成员。
2)静态成员函数不含this指针。 静态成员函数属于这个类,不再仅仅属于具体的对象。
因此类的静态成员函数和类的普通成员函数的区别是:
静态成员函数不包含指向具体对象的this指针;
普通成员函数包含一个指向具体对象的this指针。
-
【C++】 常对象、常数据成员、常成员函数总结
2019-03-24 15:07:25普通数据成员在初始化列表和函数体中初始化均可。 ◆ PS:类的成员对象若要传入参数初始化,则必须在构造函数初始化列表进行;(成员对象:当一个类的成员是另一个类的对象时,这个对象就叫成员对象。) 常对象 ...常数据成员
◆ 常数据成员必须进行初始化,并且不能被更新。
◆ 常数据成员不能在声明时赋初始值(普通数据成员也是),常数据成员必须在构造函数初始化列表进行初始化;普通数据成员在初始化列表和函数体中初始化均可。
◆ PS:类的成员对象若要传入参数初始化,则必须在构造函数初始化列表进行;(成员对象:当一个类的成员是另一个类的对象时,这个对象就叫成员对象。)
常对象
◆ ⭐常对象可以调用常成员函数,不能调用非const成员函数;非const对象,可以调用普通成员函数和常成员函数。
◆ 常对象的成员函数不一定都是常成员函数;同样的常对象的数据成员不一定都是常数据成员。
◆ 常对象一旦初始化,常对象的数据成员便不允许修改,而不是说常对象的数据成员都是常数据成员。
◆ PS:定义常对象有两种方法,1. Point const a; 2. const Point a;(同样的,定义变量或指针时,const放前放后意义一样,如:1. const double a; double const a; 2. const int *p; int const *p; 但是定义指针常量时,只能用 int * const p;)
常成员函数
◆ 常成员函数不更新对象的数据成员。
◆ 常成员函数的const关键字可以被用于参与对重载函数的区分。
◆ ⭐通常非const成员函数需要定义一个const版本的重载函数,以方便定义常对象后调用常成员函数。
◈ 如果常对象调用的常成员函数返回的是指向当前对象的指针(或返回的是当前对象),那么此常成员函数的声明的返回类型要加const,例如:◊ 成员函数返回指向当前对象的指针
const *Point fun1(); //非const成员函数的类内声明;
const *Point fun1() const; //习惯上要再声明一个常成员函数作重载函数,注意到此函数声明有两个const;◊ 成员函数返回指向当前对象
const Point fun1(); //非const成员函数的类内声明;
const Point fun1() const; //习惯上要再声明一个常成员函数作重载函数,注意到此函数声明有两个const;◊ ⭐注意,如果一个类中声明以下4个重载函数:
① Point fun1();
② const Point fun1();
③ Point fun1() const;
④ const Point fun1() const;
【解析】①和②是冲突的,因为无法区分仅按返回类型区分的重载函数;③和④是冲突的,也是因为无法区分仅按返回类型区分的重载函数。
所以正确的重载函数搭配有3种:◊ ①和③搭配:
Point fun1(); //函数返回非const对象
Point fun1() const; //函数返回非const对象
[解析]适用于定义常对象后调用常成员函数,常成员函数返回类型是非const的Point类对象。◊ ①和④搭配(这里把返回类型改为指针,因为常用):
Point *fun1() {return this; }; //函数返回指向本对象的指针
const Point *fun1() const { return this; };//函数返回指向本常对象的指针,第一个const说明返回的是指向常对象的指针,第二个const说明此函数是常函数[解析]适用于定义常对象后调用常成员函数,常成员函数返回类型是常Point类对象(如return *this;)。
◊ ②和④搭配:
const Point fun1(); //函数返回常对象
const Point fun1() const; //函数返回常对象
[解析]适用于定义常对象后调用常成员函数,常成员函数返回类型是常Point类对象。◊ ②和③搭配:
const Point fun1();
Point fun1() const;
[解析]虽然搭配合法,但是似乎不存在这种搭配。 -
c++常对象和常成员函数详解
2017-07-15 21:52:19常对象常对象是指该对象在其生命周期内,其所有的数据成员的值都不能被改变;定义对象时加上关键字const,该对象就是...1. 常对象只能调用常成员函数,不能调用普通成员函数 (除了隐式调用析构函数和构造函数),常成员 -
普通成员函数和静态成员函数
2018-03-25 19:47:25类成员包括数据成员和成员函数。 两者区别 1分配内存的时间不同 静态成员属于类本身,不属于具体类对象,在类加载时分配内存空间,程序结束时才消失。可以类名直接访问。 普通成员属于类对象,在类对象创建... -
[c++] 常成员函数
2020-02-19 12:42:25常成员函数声明: 返回类型 成员函数名(参数表) const ; 例如: int function(int x) const ; 常成员函数的主要特点: 1)不能更新类的成员变量 2)不能调用该类中没有用const修饰的成员函数,即只能调用常... -
C++类的常数据成员和常成员函数
2019-03-11 11:01:07一、常数据成员 1、定义 用const修饰的数据成员 const int hour;//定义const为常数据成员 ...不能采用在构造函数中对常数据成员进行赋初值的方法,因为常数据成员是不能被赋值的。...普通成员函数... -
静态数据成员和静态成员函数
2018-08-26 19:18:35c++中的static静态数据成员和静态成员函数应该是让大家比较头疼的东西,好像也是找工作公司面试中常常问到的东西。我自己也深有体会,在学习c++的过程中,总感觉static很烦人,但是又是一个必须懂的东西,所以今天就... -
C/C++普通函数指针和类成员函数指针的使用
2018-11-06 22:02:22之前一直以为C++成员函数没法取地址,一直使用静态函数来充当回调函数,直到近日看别人的代码才发现类成员函数也有指针。。。总结记录一下。 普通函数指针 这面是普通函数的 指针的使用方法。 #include <... -
类的static成员函数与普通成员函数的区别
2017-12-15 15:53:29成员函数:无论静态函数还是非静态函数,都是属于类的(这一点与数据成员的静态非静态不同),对象并不拥有函数的拷贝.两者的区别在于:非静态的函数由类对象(加.或指针加->;)调用,这时将向函数传递this指针.而静态函数由... -
Python:普通成员函数、类成员函数、静态函数
2020-04-02 17:38:21Python:普通成员函数、类成员函数、静态函数 Python 中的类也是一个普通对象,如果需要直接使用这个类,例如将类作为参数传递到其他函数中,又希望在实例化这个类之前就能提供某些功能,那么最简单的办法就是使用 ... -
虚函数与普通成员函数的区别
2017-12-12 17:43:47问题:类A中使用了类B的成员函数fun(非虚),没有问题。但考虑到,类B以后可能会被继承,所以将类B的fun改为virtual。修改后,程序崩溃。 -
类的成员函数和普通成员函数的区别
2015-07-29 08:51:15普通成员函数依赖一个类的对象,也就是它有一个隐藏的调用参数(this)指针,必须指向一个类的对象。 区别2: 静态函数只能访问类中的静态成员变量; 区别3:: 如果成员函数想作 -
常成员函数只能调用常成员函数 常对象智能调用常成员函数
2014-12-04 08:54:50而普通成员函数当然可以调用常成员函数 class people { private: char *name; int age; public: people(char *namestr,int i); people( const people& temp); ~people(); char *... -
static成员函数不可以直接访问成员变量和普通函数可以访问静态变量以及内存分配详解
2021-03-23 21:31:28} 归咎根本原因是因为,static函数和普通函数不同,因为它不属于任何一个对象,没有this指针,this的含义是某一个对象的起始地址,该对象的其它成员通过和this的相对地址找到,静态函数只有一个地址,当对象>=2时,... -
类的成员函数指针和静态成员函数指针 调用成员函数***
2019-08-19 21:15:29C++提供static这个关键词对静态成员进行声明,静态成员函数和类的实例化无关,对于同一类来说,静态成员函数是所有类的对象共享的。而普通成员函数需要实例化才能调用,对于每一个实例来说,普通成员函数是自己独有... -
详解C++之函数重载
2020-12-17 04:35:31函数重载本质 c++中通过函数名和函数确定一个函数 ...问题1:当父类的成员函数和子类的成员函数相等,会发生重载吗? 本质还是上面说的,因为父类和子类的作用域不在同一个 看一段代码 #include cla -
指向静态成员函数和普通成员函数的指针
2019-09-22 13:07:54相当于是熟悉一种语法吧 class Test { public: static void StaticFunc() ... printf("StaticFunc \n");...静态成员函数函数指针操作同全局函数一样;毕竟静态成员函数不需要绑定到某个对象身上。 -
C++学习--类的静态函数和普通成员函数
2018-11-05 14:11:31C++提供static这个关键词对静态成员进行声明,静态成员函数和类的实例化无关,对于同一类来说,静态成员函数是共享的。而普通成员函数需要实例化才能调用,对于每一个实例来说,普通成员函数是自己独有的。 #... -
常对象、常成员函数、静态成员函数、静态成员变量
2018-01-21 20:28:14一、const1、常对象只能调用常成员函数2、普通对象可以调用全部的成员函数包括常成员函数3、常方法不能调用普通方法 可以调用常方法、静态成员方法4、普通方法可以调用常方法解释:当一个成员函数被调用时,自动向它... -
关于类的常量成员函数和非常量成员函数之间的可调用关系
2020-06-27 09:36:27(1)下面这个错误的意思是我在我的非const成员中调用了const成员函数,这是会报错的!!!! In file included from circularListWithHeader.cpp:1:0: circularListWithHeader.h: In instantiation of ‘T& ... -
C++类成员函数指针2
2012-11-17 16:54:012.普通函数指向非静态成员函数 3. 类外部的 类函数指针 指向普通函数 4. 类外部的 类函数指针 指向成员函数 5. 类内部的 函数指针 指向成员函数 (类似于第2条) 6. 类内部的 函数指针 指向普通函数 -
C++类成员函数指针使用介绍
2019-09-21 16:07:49在之前写过的博客中有介绍过函数指针和指针函数的区别和简单用法(文章在这里),当时的Demo非常简单,都是C语言的写法,但是当在C++中直接像C那样使用类成员函数指针时就会报错:reference to non-static member ... -
c++ ——静态成员变量和静态成员函数
2019-11-24 16:03:46c++ 静态成员函数用static 关键字来声明,用于处理静态成员变量,可以用类名来调用,也可以用对象名来调用。 测试代码: #include <iostream> using namespace std; class Point{ public: Po... -
C++之常对象、常成员变量与常成员函数详解
2017-02-28 22:08:37不能通过常对象调用普通成员函数,但是可以通过普通对象调用常成员函数。常对象只能调用常成员函数。常对象的声明如下: const const 两种声明完全一样没有任何区别。 1、通过下面例子来理解常对象: A、请... -
静态成员函数和非静态成员函数的区别
2020-05-15 22:15:35静态成员函数和非成员函数的区别 从知乎上看到一个问题,看得我怀疑人生,咬牙切齿,如下图: 对于面试官的解释,把我整蒙圈了;于是自己写代码验证如下: #include<iostream> using namespace std; class A...