非静态成员函数

c++的设计准则之一就是:非静态成员函数至少和一般的非成员函数有相同的效率。编译器内部已将member函数实体转换为对等的nonmember函数实体。

转化步骤:

1.改写函数原型以安插一个额外的参数到member function中,使class object可以调用该函数,该额外参数为this指针。

2.将函数中每一个对nonstatic data member的存取操作改为经由this指针来存取

3.对函数名称进行处理,使它在程序中成为独一无二的词汇。

名称的特殊处理

一般而言,member的名称前面会由编译器加上class名称,形成独一无二的命名。

class bar

{

public:

  int ival;

};

编译后ival可能会变成ival_bar.之所以如此处理,是为了防止以下的操作:

class foo:public bar

{

public:

  int ival;

};

这样编译后会变成这样:

class foo

{

public:

  int ival_bar;

  int ival_foo;

};

由于member function可以被重载化,所以需要更广泛的mangling手法,以提供独一无二的名称。编译器利用函数名称、参数个数、参数类型来使得函数有着独一无二的名称。这样一来,可以捕捉链接时期函数名称+参数数目+参数类型方面的错误,但是如果返回类型出错,就没办法检查出来。

virtual member function(虚函数)

point3d obj;
point3d *ptr = &obj;

若normalize()是虚函数,则ptr->normalize()将会被内部转化为(*ptr->vptr[1])(ptr)

其中,vptr表示由编译器产生的指针,指向virtual table,它被安插在每一个声明有(或继承自)一个或多个virtual function的class object中。

1是virtual table slot的索引值,关联到normalize()函数,第二个ptr表示this指针。

注意:经由一个class object调用virtual function,这种操作总是被编译器像对待一般的nonstatic member function一样加以决议,也就是不会用到虚指针。

静态成员函数

在引入静态成员函数之前,c++要求所有的成员函数都必须经由该类的对象来调用。而实际上,只有当一个或多个非静态数据成员在成员函数中被直接存取时,才需要类对象。类对象提供了this指针给这种形式的函数调用使用。这个this指针把在成员函数中存取的非静态类成员绑定于对象内对应的成员之上。如果没有任何一个成员被直接存取,事实上就不需要this指针,因此也就没有必要通过一个类对象来调用一个成员函数。

独立于类对象之外的存取操作,在某个时候特别重要:当class设计者希望支持没有class object存在的情况。程序层面上的解决方法是把0强制转换为一个类指针,因而提供了一个this指针实例,语言层面上的解决方法是静态成员函数。

静态成员函数的主要特性是没有this指针,以下次要特性统统根源于主要特性:

1.它不能够直接存取所在类中的nonstatic members(需要this指针)

2.它不能够被声明为const volatile或virtual(因为虚函数通过vptr调用,而vptr属于对象,但是静态成员函数属于类)

3.可以通过类名或class object来调用

【深度探索c++对象模型】Function语义学之成员函数调用方式的更多相关文章

  1. 《深度探索C++对象模型》读书笔记(一)

    前言 今年中下旬就要找工作了,我计划从现在就开始准备一些面试中会问到的基础知识,包括C++.操作系统.计算机网络.算法和数据结构等.C++就先从这本<深度探索C++对象模型>开始.不同于& ...

  2. 深度探索C++对象模型

    深度探索C++对象模型 什么是C++对象模型: 语言中直接支持面向对象程序设计的部分. 对于各个支持的底层实现机制. 抽象性与实际性之间找出平衡点, 需要知识, 经验以及许多思考. 导读 这本书是C+ ...

  3. c++学习书籍推荐《深度探索C++对象模型》下载

    百度云及其他网盘下载地址:点我 百度云及其他网盘下载地址:点我 编辑推荐 如果你是一位C++程序员,渴望对于底层知识获得一个完整的了解,那么这本<深度探索C++对象模型>正适合你 作者简介 ...

  4. 柔性数组-读《深度探索C++对象模型》有感 (转载)

    最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...

  5. 柔性数组-读《深度探索C++对象模型》有感

    最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...

  6. [读书系列] 深度探索C++对象模型 初读

    2012年底-2014年初这段时间主要用C++做手游开发,时隔3年,重新拿起<深度探索C++对象模型>这本书,感觉生疏了很多,如果按前阵子的生疏度来说,现在不借助Visual Studio ...

  7. 拾遗与填坑《深度探索C++对象模型》3.3节

    <深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...

  8. 拾遗与填坑《深度探索C++对象模型》3.2节

    <深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...

  9. 读书笔记《深度探索c++对象模型》 概述

    <深度探索c++对象模型>这本书是我工作一段时间后想更深入了解C++的底层实现知识,如内存布局.模型.内存大小.继承.虚函数表等而阅读的:此外在很多面试或者工作中,对底层的知识的足够了解也 ...

随机推荐

  1. Linux之 if命令——简单的shell文件

    如何写一个shell文件,写一个小脚本 1.新建一个脚本文件:vi demo.sh 2.追加执行权限: chmod u+x demo.sh 3.执行脚本:./demo.sh 4.什么是脚本?把一堆命令 ...

  2. Map容器之热血格斗场

    3343:热血格斗场 总时间限制:  1000ms 内存限制:  65536kB 描述 为了迎接08年的奥运会,让大家更加了解各种格斗运动,facer新开了一家热血格斗场.格斗场实行会员制,但是新来的 ...

  3. 内存区--Java

    一.概述 对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题 ...

  4. luogu3960 列队

    参考这篇 #include <iostream> #include <cstdio> #include <vector> using namespace std; ...

  5. Leetcode 241.为运算表达式设计优先级

    为运算表达式设计优先级 给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果.你需要给出所有可能的组合的结果.有效的运算符号包含 +, - 以及 * . 示例 1: 输 ...

  6. ms sql server 大批量导入

    BULK INSERT 文章:BULK INSERT如何将大量数据高效地导入SQL Server 可以首先在数据库建一个表Temp_tb,这个表作为导入数据的表,然后使用bulk insert导入,导 ...

  7. CodeForces 22、23部分题解

    CodeForces 22A 找严格第二小的...注意只有一种情况,可以sort排序然后unique输出. int a[N]; int main() { int n; while(~scanf(&qu ...

  8. NYOJ660逃离地球——只为最大存活率~

    逃离地球 时间限制:1000 ms  |  内存限制:65535 KB 难度: 描述 据霍金的<时间简史>所述,在几亿年之后将再次发生宇宙大爆炸.在宇宙大爆炸后,地球上将新生出许多生物而不 ...

  9. [Go]条件语句

    package main import ( "io/ioutil" "fmt" ) //条件语句 //if的条件语句不需要括号 //if的条件里可以赋值,if的 ...

  10. poj 1579 简单dp由下往上

    #include<stdio.h> #include<string.h> #define N 22 int dp[N][N][N]; int main() { int n,m, ...