C++ 成员函数与成员变量的关系
2017-10-31 13:35
323 查看
在C++中,
这是因为,成员函数是属于类的,而成员变量是属于对象的。
成员函数和普通函数没有本质什么区别,都是直接调用函数的,只是比普通函数多了一个 this 指针而已。如果成员函数里面没有使用这个 this 指针(也就是没有使用任何成员变量),那么 this 指针的值为多少就无所谓了,不管他是随机值或是 NULL.
只用通过指针调用虚函数才会通过对象的虚函数表去查找函数的地址,这时指针无效就会出问题了。
在上面代码中,int* p;到底有没有在堆空间开辟一个4字节大小的内存空间呢?
没有,这是在栈内定义的一个指针,所以是在栈内开辟了一个4字节大小的内存空间(用来放指针变量了)。
与此对应的,int* p = new int;是在栈上开辟了4个字节放指针,又在堆上开辟了4个字节(准备)放int变量
函数之所以会调用成功,是因为利用指针调用类的成员函数时,只跟指针的类型有关,而与其所指内容无关,也就是说只要指针类型是这个类的指针,那就可以用它来调用这个类的成员函数。如果这个函数做的事情跟类对象无关,就像你只返回一个常数,那这个函数看起来是正常运行的,但如果在类里访问了类的成员变量(比如返回x),那就会出错,因为此时要根据指针所指的内容去访问对应的成员变量,而指针实际上没有指向正确的地方,所以会出现内存访问错误。
#include <iostream> using namespace std; struct Data{ int x = 10; int y() { return 20; } }; int main() { Data* p=NULL; // 不用 new 创建指针 cout<<p->x<<endl; //抛出异常 cout<<p->y()<<endl; //程序能正常输出20 return 0; }
这是因为,成员函数是属于类的,而成员变量是属于对象的。
成员函数和普通函数没有本质什么区别,都是直接调用函数的,只是比普通函数多了一个 this 指针而已。如果成员函数里面没有使用这个 this 指针(也就是没有使用任何成员变量),那么 this 指针的值为多少就无所谓了,不管他是随机值或是 NULL.
只用通过指针调用虚函数才会通过对象的虚函数表去查找函数的地址,这时指针无效就会出问题了。
在上面代码中,int* p;到底有没有在堆空间开辟一个4字节大小的内存空间呢?
没有,这是在栈内定义的一个指针,所以是在栈内开辟了一个4字节大小的内存空间(用来放指针变量了)。
与此对应的,int* p = new int;是在栈上开辟了4个字节放指针,又在堆上开辟了4个字节(准备)放int变量
函数之所以会调用成功,是因为利用指针调用类的成员函数时,只跟指针的类型有关,而与其所指内容无关,也就是说只要指针类型是这个类的指针,那就可以用它来调用这个类的成员函数。如果这个函数做的事情跟类对象无关,就像你只返回一个常数,那这个函数看起来是正常运行的,但如果在类里访问了类的成员变量(比如返回x),那就会出错,因为此时要根据指针所指的内容去访问对应的成员变量,而指针实际上没有指向正确的地方,所以会出现内存访问错误。
相关文章推荐
- c++中静态成员变量 静态成员函数 全局变量与静态函数的关系 字符串中括号的匹配编程 (笔试经历)
- C++ 成员函数与成员变量的关系
- C++中的线程函数如何访问类中的成员变量
- 从零开始学C++之对象的使用(一):static 成员变量、static 成员函数、类/对象的大小
- C++面向对象—成员函数与成员变量的实现机制学习笔记(1)
- C++中的继承关系、访问限定符,六个默认成员函数以及菱形继承和虚继承
- [C/C++] const 详解(修饰变量、输入参数、返回值、成员函数)
- C++如何在类的成员函数中表示同名的全局变量?
- C++基础(二)C/C++中的静态、非静态成员函数、变量
- C++ 静态数据成员 成员函数 静态变量 全局变量(2)
- c++调用类内部使用成员变量和inline函数的区别
- C++程序运行时内存布局之----------简单类实例,成员变量,成员函数,静态成员变量,静态成员函数
- C++成员变量与函数内存分配
- c++中基类和子类的成员变量同名,成员函数也同名
- C++学习笔记(3)——成员变量、成员函数的指针
- C++ 子类和父类同名成员变量或函数
- [C/C++] const 详解(修饰变量、输入参数、返回值、成员函数)
- C++继承中覆盖和隐藏基类成员变量或成员函数
- 用例子来理解c++的类,构造函数,类的多态,成员函数,成员变量
- c/c++笔试题——const类型的成员函数内部如何改变成员变量