当前位置: 首页 > 编程日记 > 正文

1.0 封装后的布局成本

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1.0.1    C语言中(.c)

1.    数据和函数是分开声明的,语言本身没有支持“数据和函数”之间的关联性。

2.    这种程序方法为程序性的,由一组“分布在各个以功能为导向的函数中”的算法驱动,处理共同的外部数据。

3.    例子

typedef struct _point
{int x;int y;
}Point;// 定义一个函数
void Point_Print(const Point *pd)
{printf("%d, %d", pd->x, pd-y);
}// 效率更高些的做法
#define POINT_PRINT(pd) \printf("%d, %d", pd->x, pd-y);// 前置处理宏
#define SET_VAL(p, xVal) (p.x) = (xVal);


1.0.2    C++语言中(.cpp)

template <class type, int dim>
class CPoint
{
public:CPoint() {}CPoint(type coords[dim]){for (int idx = 0; idx < dim; idx++){m_coords[idx] = coords[idx];}}type& operator[] (int idx){assert(idx < dim && idx >= 0);return m_coords[idx];}
private:type m_coords[dim];
};


1.0.3    C和C++的比较

1.    “一个 ADT 或 class hierarchy 的数据封装”比“C程序中程序性地使用全局数据”好。

2.    class CPoint 没有增加布局成本。

3.    数据成员和 C 结构体一样,成员函数在class声明中,但不在 object 中。

4.    非内联成员函数只有一个函数实体,而内联成员函数会在使用者上产生一个函数实体。

5.    C++ 在布局和存取时间上的主要额外负担,是由 virtual 引起的,包括:

a.    virtual function,用以支持一个有效率的“执行期绑定”。

b.    virtual base class,用以实现“多次出现在继承体系中的 base class,有一个单一而被共享的实体”。

c.    多重继承下的额外负担,derived class 和其第二,或后继之 base class 的转换。


1.0.4    完整的代码

  1. .h文件

#ifndef _PROJ10_PROJ10_proj10_
#define _PROJ10_PROJ10_proj10_//#define C_BETA
//#define CPP_BETA_1
//#define CPP_BETA_2
//#define CPP_BETA_3/**************************************************************/
#ifdef C_BETA
#include <stdio.h>typedef struct _point3d
{float x;float y;float z;
}Point3d;#define X(pt, _x) (pt.x) = (float)(_x);
#define Y(pt, _y) (pt.y) = (float)(_y);
#define Z(pt, _z) (pt.z) = (float)(_z);#define POINT3D_PRINT(pt) \printf("(%f, %f, %f)\n", pt.x, pt.y, pt.z);void Point3d_Print(const Point3d& pt3d)
{printf("(%f, %f, %f)\n", pt3d.x, pt3d.y, pt3d.z);
}
#endif // C_BETA
/**************************************************************//**************************************************************/
#ifdef CPP_BETA_1
#include <iostream>class CPoint3d
{friend std::ostream& operator<< (std::ostream& os, const CPoint3d& pt);public:CPoint3d(const float& x = 0.0, const float& y = 0.0, const float&z = 0.0){m_x = x;m_y = y;m_z = z;}~CPoint3d(void) {}void x(const float& x) { m_x = x; }void y(const float& y) { m_y = y; }void z(const float& z) { m_z = z; }float x(void) const { return m_x; }float y(void) const { return m_y; }float z(void) const { return m_z; }private:float m_x;float m_y;float m_z;
};inline std::ostream& operator<< (std::ostream& os, const CPoint3d& pt)
{os << "(" << pt.x() << ", " << pt.y() << ", " << pt.z() << ")" << std::endl;return os;
};#endif // CPP_BETA_1
/**************************************************************//**************************************************************/
// 坐标类型参数化
#ifdef CPP_BETA_2
#include <iostream>template <class type>
class CPoint3d;template <class type>
std::ostream& operator<< (std::ostream& os, const CPoint3d<type>& pt);template <class type>
class CPoint3d
{friend std::ostream& operator<< <type>(std::ostream& os, const CPoint3d<type>& pt);public:CPoint3d(const type& x = 0.0, const type& y = 0.0, const type&z = 0.0){m_x = x;m_y = y;m_z = z;}~CPoint3d(void) {}void x(const type& x) { m_x = x; }void y(const type& y) { m_y = y; }void z(const type& z) { m_z = z; }type x(void) const { return m_x; }type y(void) const { return m_y; }type z(void) const { return m_z; }private:type m_x;type m_y;type m_z;
};template <class type>
std::ostream& operator<< (std::ostream& os, const CPoint3d<type>& pt)
{os << "(" << pt.x() << ", " << pt.y() << ", " << pt.z() << ")" << std::endl;return os;
};#endif // CPP_BETA_2
/**************************************************************//**************************************************************/
// 坐标类型和坐标数目都参数化
#ifdef CPP_BETA_3
#include <assert.h>
#include <iostream>template <class type, int dim>
class CPoint3d;template <class type, int dim>
std::ostream& operator<< (std::ostream& os, const CPoint3d<type, dim>& pt);template <class type, int dim>
class CPoint3d
{friend std::ostream& operator<< <type, dim>(std::ostream& os, const CPoint3d<type, dim>& pt);public:CPoint3d(void) {for (int i = 0; i < dim; ++i){m_coords[i] = 0;}}CPoint3d(type coords[dim]){for (int i = 0; i < dim; ++i){m_coords[i] = coords[i];}}~CPoint3d(void) {}inline type& operator[] (const int& idx){assert(idx < dim && idx >= 0);return m_coords[idx];}inline type operator[] (const int& idx) const{assert(idx < dim && idx >= 0);return m_coords[idx];}private:type m_coords[dim];
};template <class type, int dim>
std::ostream& operator<< (std::ostream& os, const CPoint3d<type, dim>& pt)
{os << "(";for (int i = 0; i < dim - 1; ++i){os << pt[i] << ", ";}os << pt[dim - 1] << ")" << std::endl;return os;
};#endif // CPP_BETA_3
/**************************************************************/#endif //_PROJ10_PROJ10_proj10_


2.    .cpp文件

#include "proj1.0.h"int main(void)
{
#ifdef C_BETAPoint3d pt;pt.x = 1.0;pt.y = 2.0;pt.z = 3.0;printf("(%f, %f, %f)\n", pt.x, pt.y, pt.z);Point3d_Print(pt);POINT3D_PRINT(pt);X(pt, 1.1);Y(pt, 2.1);Z(pt, 3.1);
#endif // C_BETA#ifdef CPP_BETA_1CPoint3d pt;std::cout << pt;
#endif // CPP_BETA_1#ifdef CPP_BETA_2CPoint3d<int> pt;std::cout << pt;
#endif // CPP_BETA_2#ifdef CPP_BETA_3CPoint3d<int, 2> pt;std::cout << pt;
#endif // CPP_BETA_3return 0;
}


转载于:https://my.oschina.net/u/2250495/blog/352643

相关文章:

通过gdb core dump方法查看程序异常时的堆栈信息

在Linux下可通过core文件来获取当程序异常退出(如异常信号SIGSEGV, SIGABRT等)时的堆栈信息。core dump叫做核心转储&#xff0c;当程序运行过程中发生异常的那一刻的一个内存快照&#xff0c;操作系统在程序发生异常而异常在进程内部又没有被捕获的情况下&#xff0c;会把进程…

日均350000亿接入量,腾讯TubeMQ性能超过Kafka

整理 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;【导读】近日&#xff0c;腾讯开源动作不断&#xff0c;相继开源了分布式消息中间件TubeMQ&#xff0c;基于最主流的 OpenJDK8开发的Tencent Kona JDK&#xff0c;分布式HTAP数据库 TBase&#xff0c;企业级…

iOS应用版本更新(自动提醒用户)

在#import "AppDelegate.h" 文件中的application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions 方法中调用检测结果 获得发布版本的Version 比较当前版本与新上线版本做比较 UIAlertView代理方法

Bash Shell脚本编程-变量知识

Shell:GUI CLI提供交互式接口&#xff1a;提高效率命令行展开&#xff1a;~ &#xff0c;{}命令别名&#xff1a;alias命令历史&#xff1a;historyGlobbing&#xff1a;*&#xff0c;&#xff1f;&#xff0c;[]&#xff0c;[^]命令补全&#xff1a;$PATH指定的目录下路径补全…

FFmpeg中可执行文件ffplay用法汇总

从https://ffbinaries.com/downloads 下载最新的4.1版本的windows 64位FFplay。目前linux下的只有3.2版本的。FFplay是一个由FFmpeg和SDL库组成的简单媒体播放器&#xff0c;它主要用作各种FFmpeg API的测试。 通过执行以下命令将FFplay信息重定位到ffplay_help.txt文件中便于…

用Go重构C语言系统,这个抗住春晚红包的百度转发引擎承接了万亿流量

整理 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;11 月 20 日&#xff0c;百度的万亿流量转发引擎 BFE 登上了 GitHub Trending Top 3&#xff0c;今日 Star 已突破 270。事实上&#xff0c;这个曾经抗住 2019 年春晚抢红包的转发引擎早已于 2019 年夏在 G…

Swift3.0带来的变化汇总系列一——字符串与基本运算符中的变化

var string "Hello-Swift" //获取某个下标后一个下标对应的字符 char"e" //swift2.2 //var char string[startIndex.successor()] //swift3.0 var char string[string.index(after: startIndex)] //获取某个下标前一个下标对应的字符 char2 "t&qu…

vc+如何添加右键弹出菜单

2019独角兽企业重金招聘Python工程师标准>>> 一、创建新工程 二、编辑菜单资源 1、添加菜单 按“CtrlR”&#xff0c;双击“Menu”图标2、于菜单编辑器内编辑菜单四、添加代码&#xff08;红色部分&#xff09; void CCMenuView::OnUpdateShow(CCmdUI* pCmdU…

EMNLP 2019 | 大规模利用单语数据提升神经机器翻译

BDTC大会官网&#xff1a;https://t.csdnimg.cn/q4TY作者 | 吴郦军、夏应策来源 | 微软研究院AI头条&#xff08;ID:MSRAsia&#xff09;编者按&#xff1a;目前&#xff0c;目标语言端的无标注单语数据已被广泛应用于在机器翻译任务中。然而&#xff0c;目标语言端的无标注数据…

swift 3.0 json解析、字典转模型三种方案

swift3.0发布有一段时间了&#xff0c;发现很多朋友在swift3.0json解析上上遇到很多问题&#xff0c;我这边为大家提三种常见的json方案。 1.第一种是自带的字典转模型&#xff0c;自带的需要实现系统的setValue方法&#xff0c;然后自己还要实现dictToModel方法即可解析&…

海思3559A上编译GDB源码操作步骤及简单使用

1. 从http://ftp.gnu.org/gnu/gdb/ 下载最新稳定版8.3&#xff0c;即gdb-8.3.tar.gz&#xff0c;解压缩&#xff1b; 2. 在gdb-8.3目录下&#xff0c;创建一个build.sh脚本文件&#xff0c;内容如下&#xff1a; ./configure \--prefix"$PWD/install" \--targetaar…

Hibernate之继承映射

Hibernate的继承映射可以理解为两个持久化类之间的继承关系 例如老师和人之间的关系 持久化类 Person类 public class Person { private Integer id; privvate String name; private String sex; public Person (){} // 无参构造器 p…

AutoML未来可期,工程师的明天何去何从?

人工智能和机器学习建模专业技术人才紧缺&#xff0c;即使是高水平的人工智能专家&#xff0c;在大数据智能分析机器学习建模时&#xff0c;主要依靠人工经验&#xff0c;建模过程费时费力&#xff0c;缺少有效方法。为了解决这一突出问题&#xff0c;国内外出现了一种用机器学…

海思3559A上编译Valgrind源码操作步骤

注&#xff1a;按照以下步骤可以在海思板子上正常编译valgrind源码并生成valgrind可执行文件,但可能还不能在海思板子上正常使用。 1. 从http://valgrind.org/downloads/?srcwww.discoversdk.com 下载Valgrind 3.15.0即valgrind-3.15.0.tar.bz2&#xff1b; 2. 在valgrind-3…

Swift之SDWebImage第三方框架

在学习Swift过程中&#xff0c;最害怕的使用了OC的第三方框架 好不容易配置成功了&#xff0c;却出现了意外的Bug [UIImageView setImageWithURL:]: unrecognized selector sent to instance解决办法 第一次配置的时候&#xff0c;因为百度了教程&#xff0c;所以一次性成功…

文件分区格式化及挂载

创建一个5G的分区&#xff0c;文件系统为ext2&#xff0c;卷标为DATA&#xff0c;块大小为1024&#xff0c;预留管理空间为磁盘分区的8%&#xff1b;挂载至/backup目录&#xff0c;要求使用卷标进行挂载&#xff0c;且在挂载时启动此文件系统上的acl功能&#xff1b;在虚拟机创…

iOS开发swift版异步加载网络图片(带缓存和缺省图片)

iOS开发之swift版异步加载网络图片 与SDWebImage异步加载网络图片的功能相似&#xff0c;只是代码比较简单&#xff0c;功能没有SD的完善与强大&#xff0c;支持缺省添加图片&#xff0c;支持本地缓存。 异步加载图片的核心代码如下&#xff1a; func setZYHWebImage(url:NSStr…

2097352GB地图数据,AI技术酷炫渲染,《微软飞行模拟器》游戏即将上线

整理 | 若名出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;“只要是真实存在的地方&#xff0c;你都能抵达。”作为即将成为第一款将整个地球化作虚拟世界来供玩家玩的游戏&#xff0c;微软的《微软飞行模拟器》&#xff08;Microsoft Flight Simulator&#xff09;…

开源库nothings/stb的介绍及使用(图像方面)

GitHub上有个开源的stb库&#xff0c;Star数已过万&#xff0c;地址为https://github.com/nothings/stb&#xff0c;为何叫stb&#xff0c;是用的作者名字的缩写Sean T. Barrett。此库仅包含头文件&#xff0c;除stretchy_buffer.h外&#xff0c;其它所有文件以前缀stb开头&…

git stuff

git stuff trick git bash 无法标记复制解决办法 git bash窗口左上角图标点击,选择属性->选项->快速编辑模式 确定就ok了 Usual Commands 创建分支git branch branch-namegit push origin branch-name 删除分支git branch -r -d origin/branch-name 删除远程分支git push…

swift3.0之闭包

Swift 相比原先的 Objective-C 最重要的优点之一&#xff0c;就是对函数式编程提供了更好的支持。 Swift 提供了更多的语法和一些新特性来增强函数式编程的能力&#xff0c;本文就在这方面进行一些讨论。 Swift 概览 对编程语言有了一些经验的程序员&#xff0c;尤其是那些对多…

Linux下gdb attach的使用(调试已在运行的进程)

在Linux上&#xff0c;执行有多线程的程序时&#xff0c;当程序执行退出操作时有时会遇到卡死现象&#xff0c;如果程序模块多&#xff0c;代码量大&#xff0c;很难快速定位&#xff0c;此时可试试gdb attach方法。 测试代码main.cpp如下&#xff0c;这里为了使程序退出时产生…

一行Python代码能实现这么多丧心病狂的功能?(代码可复制)

最近看知乎上有一篇名为《一行 Python 能实现什么丧心病狂的功能&#xff1f;》&#xff08;https://www.zhihu.com/question/37046157&#xff09;的帖子&#xff0c;点进去发现一行Python代码可以做这么多丧心病狂的功能&#xff01;整理了一下知乎上这篇文章的内容&#xff…

一步一步写算法(之图结构)

原文:一步一步写算法&#xff08;之图结构&#xff09; 【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 图是数据结构里面的重要一章。通过图&#xff0c;我们可以判断两个点之间是不是具有连通性…

FFmpeg中可执行文件ffprobe用法汇总

从https://ffbinaries.com/downloads 下载最新的4.1版本的Windows 64位FFprobe&#xff0c;FFprobe用于从多媒体流中获取相关信息或查看文件格式信息&#xff0c;并以可读的方式打印&#xff0c;FFprobe可以作为一个命令行程序单独使用。 通过执行以下命令将FFprobe信息重定位…

CocoaPods导入的库其头文件导入的方法

尽管CocoaPods使用十分方便,但其导入的第三方框架还是要经过几步操作,才能供项目使用; 第一步:导入库 1>-在终端进入项目的根目录; 2>-输入:touch Podfile,则项目文件夹会创建一个空的Podfile,这时,你可以将你想要导入的库写在里面.如: platform :ios, 6.0 pod RESid…

Google、微软、阿里、腾讯、百度这些大公司在GitHub上开源投入排名分析 | CSDN原力计划...

扫码参与CSDN“原力计划”作者 | 村中少年来源 | CSDN原力计划获奖作品现在有越来越多的公司都参与了开源&#xff0c;其背后有各自的目的所在&#xff0c;姑且不予讨论。本文是从多个方面分析各大公司在开源上的投入情况。由于全世界绝大多数的开源项目都有发布到Github上&…

jquery源码解析:each,makeArray,merge,grep,map详解

jQuery的工具方法&#xff0c;其实就是静态方法&#xff0c;源码里面就是通过extend方法&#xff0c;把这些工具方法添加给jQuery构造函数的。 jQuery.extend({ ...... each: function( obj, callback, args ) { //$.each(arr , function(i,value){}),第三个参数用于…

swift实现提示框第三方库:MBProgressHUD

GitHud的下载地址是&#xff1a;https://github.com/jdg/MBProgressHUD/ 下载完成后&#xff0c;将MBProgressHUD.h和MBProgressHUD.m拖入已经新建好的Swift项目。因为使用的swift语言&#xff0c;所以拖入项目的时候会提示是否新建一个桥接objective-c与swift的文件&#xff…

这段Python代码让程序员赚300W,公司已确认!网友:神操作!

Python到底还能给人多少惊喜&#xff1f;笔者最近看到了这两天关于Python最热门的话题&#xff0c;关于《地产大佬潘石屹学Python的原因》&#xff0c;结果被这个回答惊到了&#xff1a;来源&#xff1a;知乎 https://www.zhihu.com/question/355880221笔者翻了翻那些回答&…