思考题:
我们可以说,静态数据成员和静态成员函数时类的一部分,而不是对象的一部分(谭老师说的)。
那么,对于非静态成员函数来说,又是怎样的呢?
回答:
我们先来成员函数的存储方式。
我们都知道,一个类包含数据和函数。当我们实例化一个对象的时候,因为这个对象是用类定义的,那么它理所当然拥有了这个类的数据和函数。但是,一般情况下,不同的对象,他们的的数据值不同,但是函数的代码都相同。所以,为了节约存储空间(想象一下我们如果定义了100个对象,那么用100段内存空间存储相同的代码,岂不是很浪费?),我们让成员函数的代码共享。
我们把成员函数的代码存储在对象空间之外。换句话说,成员函数的代码,都不占据对象的存储空间。它会被存在其他地方。
所以类的成员函数,对于类来讲。一方面是逻辑上的“属于”,一方面是物理上的“不依赖“。
回到思考题上来,对于非静态成员函数来说,它当然是对象的一部分。(只是因为存储方式上的特殊性,容易让人误解!)
实例:
我们来举一个例子,说明,成员函数的代码没有存放在C++编译器为对象申请的内存空间中。
//////////////////////////////////////////////////////////////////////////
// author : Erin
// date : 20100721
// introduction : reveal the storing way of MemberFunction of a Class
//////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include <iostream>
using namespace std;
class Time
{
private:
int hour;
int minute;
int sec;
void setTime(int a, int b, int c)
{
hour = a;
minute = b;
sec = c;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
cout << "The Byte Number of 'Time' is :" << endl;
cout << sizeof(Time) <<endl;
return 0;
}
这是一个win32控制台工程,实现截图如下:
sizeof 方法用于求类的字节数。由此可知Time类对象(如果实例化的话)的字节数为12。已知int类对象的字节数为4,即有sizeof(int)=4。故知一个对象所占的内存空间大小只取决于该对象中数据成员所占空间,而与成员函数无关。
- 大小: 10.7 KB
分享到:
相关推荐
C++标准库提供了`std::function`,它可以存储任何可调用对象(包括成员函数)。为了使成员函数可存储,我们需要一个对象实例和成员函数指针。例如,可以使用`std::bind`或者lambda表达式来包装成员函数和其对应的...
### C++将类的成员函数作为回调函数 #### 背景与问题 在C++编程中,回调函数是一种常见的设计模式,它允许程序在特定的事件或条件下调用一个预先注册的函数。然而,当涉及到类的成员函数时,事情变得稍微复杂了...
在C++11及更高版本中,`std::function`和`std::bind`提供了更现代、更灵活的方式来处理成员函数,它们可以包装任何可调用对象,包括成员函数指针,而且使用起来更加简洁。 总的来说,C++中的成员函数指针和functor...
### 通过函数指针调用C++非静态成员函数 在C++编程中,通过函数指针调用非静态成员函数是一种高级技巧,主要用于实现回调、动态绑定等场景。本文将详细探讨如何在Visual C++ 6.0 (VC6.0) 和Borland C++ Builder 6.0...
* 静态成员函数的地址可以用普通函数指针来储存。 * 静态成员函数不可以调用类的非静态成员,因为静态成员函数不含this指针。 * 静态成员函数不可以同时声明为virtual、const、volatile函数。 例如: class base{ ...
### 成员函数指针与高性能的C++委托 在C++中实现类似C#或Java等面向对象语言中的委托功能是一项挑战但也极具价值的技术实践。本文将深入探讨如何利用成员函数指针来创建高效的C++委托,并分析其背后的原理和技术...
- **std::function**:`std::function`是一个通用的目标类型,可以存储、复制函数对象,包括普通函数、成员函数、绑定表达式、lambda表达式等。这为在C++中实现更高层次的函数式编程概念(如高阶函数)提供了基础。 ...
成员变量用于存储类的状态信息,而成员函数则用于定义可以对这些状态执行的操作。 #### 创建类与成员变量 首先,我们需要定义一个类,并在类中声明成员变量。例如,在给定的示例中,定义了一个名为`MyClass`的类,...
那么,类的非静态成员函数会被存储在哪里呢? 首先,让我们了解一下代码段的概念。代码段是程序中存储代码的区域,它是程序的核心部分。所有的函数代码都存储在代码段中,包括类的成员函数。函数代码不存在入栈问题...
C++中的静态成员函数是类的一个重要特性,它们在程序设计中扮演着独特角色。静态成员函数和静态数据成员有着显著的特点和用途。 一、静态数据成员 静态数据成员是类的共享属性,不依赖于类的任何实例,而是属于...
总结来说,C++中的运算符重载通过成员函数或友元函数实现,它扩展了运算符的功能,使我们可以用自然的方式来操作自定义类型。成员函数重载运算符通常用于单个对象操作,而友元函数适用于需要两个对象参与的运算。...
- **成员函数(Member Functions)**:类的成员函数是定义在类体内的函数,可以访问类的私有和保护成员。 - **友元函数(Friend Functions)**:非成员函数可以被声明为某个类的友元,从而能够访问该类的私有和...
在C++中,虚函数允许我们通过基类的指针或引用来调用派生类的成员函数,从而实现了动态绑定(即多态性)。这种机制使得代码更加灵活和通用,可以处理不同类型的对象而无需显式地了解具体类型。 #### 虚函数表的概念...
std::function是通用的函数包装器,可以存储任何可调用对象,包括函数指针、成员函数指针、lambda表达式等。 C++的异常处理机制也与函数紧密相关。通过try、catch和throw关键字,可以在函数中捕获和处理运行时错误...
虚函数表(Virtual Table,简称V-Table)是一种机制,用于存储类的虚函数的地址,解决继承和覆盖的问题,使得父类的指针可以正确地调用子类的成员函数。 虚函数表的实现机制是通过在对象实例的内存中分配一个表,这...
### C++静态成员变量与静态成员函数详解 #### 静态成员变量 在C++中,静态成员变量是类的一个特殊成员,它被所有该类的对象所共享。这意味着无论创建多少个对象,静态成员变量都只有一个副本存在于内存中。 **...
在C++编程语言中,获取类的成员函数的函数指针是一项重要的技术,它允许我们动态地调用对象的成员函数。下面将详细介绍这一概念,并通过实例代码进行解析。 首先,我们需要理解成员函数指针的概念。成员函数是类的...
在这个例子中,我们定义了一个指向成员函数的函数指针类型`PTZCmdImpl`,该成员函数不接受任何参数并返回`int`类型。 ```cpp typedef int (A::*PTZCmdImpl)(); ``` 这里`A`是某个类的名字。`PTZCmdImpl`是一个指向...
对于类而言,成员函数是其对象可以直接调用的函数,用于实现类的行为。成员函数可以是公有的、私有的或受保护的,这决定了其可访问性。 8. 友元函数: 友元函数可以访问类的私有和受保护成员,提供了一种打破封装...
多态性允许程序员使用基类类型的指针或引用调用派生类的成员函数,这种能力极大地增强了程序的灵活性与可扩展性。本文旨在探讨C++中的虚函数调用机制,通过分析一个简单的示例程序,解释虚函数如何在运行时被正确地...