您的位置:首页 > 其它

杂项讨论

2012-12-27 12:46 239 查看
item 32 在未来时态下编程。

牢记事情会改变。或许应了那句哲学道理:静止是相对的,运动是绝对的。

这个虽然能做到不是那么容易的事情,但是只要有了这方面的意识,就吵着这方面的努力。进一步学习面向对象和泛型编程的知识,并在实际工作不断的实践体会。

Item 33 将非尾端的类设计为抽象类。

当原有的具体类被当作基类使用,才强迫导入一个新的抽象类。

坚持这个原则,可以提升整个软件的可靠度、健壮度、精巧度、可扩充度。

Item 34 如何在同一个程序中结合C++和C。

(1)名称重整:方法重载被一种称为名称重整(name mangling)的技术所支持。编译器通过把原方法名称与其参数相结合产生一个独特的内部名字来取代原方法名称,用这样的函数名,来唯一标识每个函数。

extern "C"
void drawLine(int x1,int y1,int x2,int y2);

上述代码中的extern “C”仅仅是告诉编译器,name mangling被压抑。如果其他语言写的函数,要在C++中使用,也是extern “C”来声明。

__cpluscplus针对C++才有定义。

(2)statics的初始化。

静态对象、全局对象、namespace内的对象以及文件范围的对象,构造函数综述在main之前就获得执行。这过程被称为static initialization。

通过static initialization产生出来的对象,其析构函数必须在static destruction过程中被调用,这发生在main结束之后。

程序主要由C完成,C++只是个支持库的情况下,难免C++库中会有静态对象。

因此需要再C++中也要写上main函数,可以将C的main函数命名为realMain,然后在C++main函数中调用realMain。//这个不是太明白

我在redhat系统做了如下测试:

头文件Tester.h:

class Tester
{
public:
void Print();
private:
static int testinClass;
};

int Tester::testinClass=10;
void Tester::Print()
{
cout<<testinClass<<endl;
}

extern "C"
{
static int test=100;
void print();
}

Tester.cpp:

#include "Tester.h"

void print()
{
cout<<test<<endl;
Tester t;
t.Print();
}


编译:g++ -shared -o libmy.so Tester.cpp

然后将生成的libmy.so拷贝至/usr/lib目录下。

使用dll的usedll.c:

#include <stdio.h>
#include <dlfcn.h>

#define USEDLL "libmy.so"

void (*print)();

int main()
{
void *dp=dlopen(USEDLL,RTLD_LAZY);
if(dp)
{
print=dlsym(dp,"print");
print();
}
else
printf("something wrong!\n");

return 0;
}

编译:gcc -rdynamic -ldl -s -o myapp usedll.c

然后运行./myapp

结果第一行是100,第二行是10;也就是dll中的一个全局的静态变量,一个类内部的静态变量均得到了正确的值。

是不是我没有理解作者的意思?继续研究。

(3)动态内存分配:

C中:malloc/free。

C++中:new/free。

一定要成对的使用,不要free new出来的对象,也不要delete malloc分配的内存,他们的行为都未定义。

(4)数据结构:在C和C++之间对数据结构做双向的交流是安全的,前提是那些结构的定义式在C和C++中都可以编译。给C++的结构体加上非虚函数,虽然不兼容于C,但是内存布局不会发生改变,不影响其兼容性。其他任何改变则几乎都会影响。

打算在同一个程序中混用C++和C,请用以下几个简单守则:

(1)确定C和C++编译器产出兼容的目标文件。

(2)将双方都是用的函数声明为extern "C"。

(3)如果可能,尽量在C++中撰写main。

(4)总是delete删除new返回的内存,free释放malloc返回的内存。

(5)将两个语言间的数据传递限制于C所能了解的形式。

Item 35 让自己习惯于标准C++语言。

标准程序库的几大能力:

(1)支持C标准函数库。

(2)支持strings。typedef basic_string<char> string;

(3)支持国别(地域别、本土化)

(4)支持I/O。

(5)支持数值应用。

(6)支持广泛用途的容器和算法。

STL:以三个概念为基础:Container、iterators、algorithms。

Container:持有一系列对象。

Iterators:类似指针的对象,可以编译STL Containers。

Algorithms:作用域STL Containers身上的函数,以iterators来协助工作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: