背对时空隧道的出口分享 http://blog.sciencenet.cn/u/justinzhao

博文

关于VS中c++编程的几点说明

已有 4897 次阅读 2011-7-31 16:25 |个人分类:程序设计|系统分类:科研笔记| 编程规范

最近一周为了做对比试验,把别人的c++源码package移到自己的工程里,在移植过程中碰到一些问题,总结如下:

 

1. 友元,友元类模板

面向对象编程的一个特点的 类的封装性,有人把类比作solid wall, 而friend function/class则是该wall上的一个窗户,使得友元function/class可以访问类的private成员。友元函数在运算符重载时常用到,比如当双目运算符左操作数是其他类的对象时,重载的运算符不能是成员函数,只能是友元函数;另一种表述是,当希望重载的运算符满足交换律时,最好重载为友元函数。至于把一个类声明为另一个类得友元类,该类可以访问那个类的private成员,而且这个类的声明可以放在public,protected 或者private部分。 模板友元类,顾名思义,就是友元类也得是模板类,而且还得先于声明。

 

2. template class

模板类当然是object-oriented programming多态性的体现了,在OOP中,声明文件(.h)和定义文件(.cpp)一般是要分开的,然而如果一个类为模板类,分开模式不一定能编译成功,这与编译器相关。在VS中有人说分开时要#include ".cpp" 而不再是#include ".h", 这样即使能编译成功,可是破坏了一致性,使程序的readability变差。还有一种说法是在 ".h" 文件的末尾加上 #include ".cpp", 当我试过了,编译不成功,即使再加上CPP文件的宏定义,也不行。但是,如果cpp文件也和h文件combine在一个文件中,编译是不会有问题的。

关于模板类中的friend函数,如果函数形参列表里的参数类型数多于模板类的参数类型数,比如模板类定义为 template<Class T> Class Test {}, 而friend函数的形参为 function(T a, T1 b),这时在friend函数前面需要加上 template<Class T, Class T1>, 也就是要告诉friend函数所有的形参类型以便编译。而普通成员函数只需要加template<Class T1> 就行,它本身属于类Test,而Test是有Class T的,所以不必像friend函数那样再加进去。

 

3 const类型声明

成员函数的形参中是const出现频次最高的地方,道理很简单,保证成员函数不改变参数的值;在类的设计中,很多类的成员函数的最后也添加一个const,这是为了保证改成员函数执行过程中不改变类得成员值。

如果一个类中有const类型的成员变量,首先,它的实现得放在cpp文件中,再有,它的赋值不能放在成员函数里面,这时,编译时会认为成员函数试图改变const变量的值而报错,它应该放在哪里呢? 如果它是static,则放在实现文件中、成员函数之外,如果是非static,则只能采用构造函数中 冒号+逗号分隔号的初始化列表中。

说明:如果一个类中用static const类型的变量,则它的初始化必须放在实现文件中,放头文件中会出现redefinition错误,即使在头文件中加上#ifndef #def #endif 或则 #pragma once。

 

总之,我还只是编译不同编译器、同种语言的程序,就会出现很多compatability问题,这就就像不同系统间、不同数据库communicating时会出现兼容的问题一样,对于像我这种对计算机底层指令一窍不通的人,还是很烦恼这些非算法层面的东东的,只是寄希望与以后一个规划的编程习惯。



https://wap.sciencenet.cn/blog-284987-470310.html

上一篇:point process, stochastic geometry 在high-level CV中的应用
下一篇:再说 贝叶斯网、马尔科夫随机场
收藏 IP: 128.125.163.*| 热度|

2 彭云 黄富强

该博文允许注册用户评论 请点击登录 评论 (1 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-21 09:53

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部