普通成员函数、普通类成员函数和静态类成员函数
2017-12-25 21:40
148 查看
/* 2017-12-26 创建人:Ruo_Xiao */
#include "stdafx.h" #include <iostream> using namespace std; int cross(int i,int t); class CA { public: CA() { k = 100; } ~CA() { ; } public: int k; public: int X_R(int i,int t) { return (i+t)*cross(i,t); } static int add_1(int i,int t) { return (i+t); } static int add_2(CA *p,int i,int t) { return (i+t+p->k); } }; int _tmain(int argc, _TCHAR* argv[]) { int R1 = CA::add_1(11,90); CA B; int R2 = B.X_R(3,5)*cross(1,2); int R3 = CA::add_2(& 4000 B,20,30); cout<<"R1 = "<<R1<<endl; cout<<"R2 = "<<R2<<endl; cout<<"R3 = "<<R3<<endl; cin.get(); return 0; } int cross(int i,int t) { return i*t; }
一、普通成员函数
上述代码中,cross函数既可以在类成员函数中调用,亦可在类外调用。说明普通成员函数调用位置不受限制。二、普通类成员函数
C++ 普通成员函数本质上是一个包含指向调用该函数的对象的this指针的普通函数,即C++类的普通成员函数都隐式包含一个指向当前对象的this指针(第一个形参!)。上述代码中,
B.X_R(3,5);
相当于
X_R(&B,3,5);
即:
int CA::X_R(int i,int t) { return (i+t)*cross(i,t); }
相当于
int CA::X_R(CA *this,int i,int t) { return (i+t)*cross(i,t); }
属于类,即不同的对象在内存中共用一个函数,不像类成员变量那样不同的对象有不同的拷贝(内存)。
区分方法是“->”或者“.”将对象的this指针传进函数体内。
成员函数的地址,编译期就已确定,并静态绑定或动态的绑定在对应的对象上。对象调用成员函数时,早在编译期间,编译器就可以确定这些函数的地址,并通过传入this指针和其他参数,完成函数的调用,所以类中就没有必要存储成员函数的信息。
三、静态成员函数
类普通成员函数前面加个“static”关键字即可成为静态成员函数。属于类而不属于该类的对象。
调用方式:类名::静态成员函数,故不传对象的指针,通常用于对静态成员变量的操作。
创建时期:类加载时就被分配了内存(全局区)。
不可访问非静态成员(变量和函数),因为该静态成员函数存在时,非静态成员不一定存在。或者因为静态成员函数没有隐藏的this指针,故无法调用非静态的成员。若要引用非静态成员,请引入对象指针。
四、源码
http://download.csdn.net/download/itworld123/10174599相关文章推荐
- 静态类成员函数无法访问普通的成员变量
- 普通成员函数和静态成员函数
- 类的成员函数和普通成员函数的区别
- 内联函数与普通函数、成员函数与静态函数的区别(知识整理)
- inline&nbsp;定义普通函数和类的成员函…
- C++普通成员函数的重定义
- 【解惑】函数名与函数指针(普通C/C++函数、C++类*静态*函数名取不取址都一样,但C++类成员函数必须取址)
- 普通函数指针和指向成员函数指针
- java中对象多态时成员变量,普通成员函数及静态成员函数的调用情况
- mfc中普通函数调用类的成员函数或者mfc类库中的函数
- 在同一个类中的普通成员函数中调用static 成员变量,linker出错,无法解析的外部命令?
- 静态成员函数与普通成员函数的区别
- 成员函数指针:(结构+与普通函数指针之间的转换)
- static全局变量/全局变量,static函数/普通函数,函数中static变量/函数中的变量,类中的static成员变量/普通类成员变量
- java中对象多态时成员变量,普通成员函数及静态成员函数的调用情况
- C++静态类成员和静态类成员函数
- 类成员函数当作普通函数指针 用于callback
- 类中的三种函数(普通成员函数、静态成员函数、COSNT成员函数)总结
- C++运算符重载三种形式(成员函数,友元函数,普通函数)详解
- 类反射学习(三) JAVA如何利用类反射调用普通函数、访问成员成员变量