最近C++使用心得

January 06, 2013 21:52


这一周把好久没用过的C++又拿出来练练手了,一直对第一次学的编程语言恋恋不舍啊,哈哈。

也就练练一些简单的东西。。熟悉下语法了,复杂的咱也不会了,发现这东西还真是用多自然会了,理解的也深刻了。。

开始写时,由于很多没用了,写着写着,突然发现写成了ruby,汗死,不时把判断写成这样的形式

a = 1 if b

然后又用end结尾。弄了一两天,12月31号去公司上班时,写ruby又用{}括号写函数了,混乱了。。。

先是const,这个用到指针上我都搞不清了,前几天在哪个文章中看到const是对左边的东东起作用的, 如果左边是空的就取右边的东东。好像是这么一回事,如:

const int a = 1; // 左边冒得,所以int 是常量

const int * p; // 左边冒得,所有指针指向的int 是常量

int const * p; //左边有个int ,所有和上面一个一样,指向的int是常量


// 第一个const不说了,第二个左边是星星,指针的标识啊,所以这个指针也是常量不能改
const int * const p = &a;

应该没错吧,哈哈,如有错误,后果自理。。。。

然后,后面的几天里开始写一个遍历一个地图的函数,前半天函数思路是出来了, 用一个递归去地图上每一个点去走,分每个点可以向八个方向移动,后两天就一直被内存这一块卡到了, 一运行就是内存报错,两天时间不得其解。。。

然后和朋友聊聊,应该是类有问题,就在网上搜一下,无意中看到了复制函数,呃,这个。。我只记得构造和析构函数去了, 完全把复制函数给忘了,而我用的那个类里有new出来的东东,然后内存被多次释放的悲剧就出来了。。 立刻把复制函数加上,代码成功运行了:

class Obj {
public:
  Obj(); //构造函数
  ~Obj(); //析构函数
  Obj(const Obj &obj); //复制函数

  const Obj & operator=(const Obj &obj); //赋值
};

//.. 实现

Obj a; //构造
Obj b = a; // 复制
Obj c;
Obj c = a; // 赋值

// 析构么,出了作用域自动调用了,new的对象要等delete才调用

折腾好了这个,又开始折腾模板,模板,其实我以前自己学C++时就没怎么深入理解。。。然后今天用时,发现真不会过了。。

template <class T>
deftype void (*FUNC)(T); // 模板不能这么用。。我今天按记忆中的方法用了才知道,哈哈

template <class T>
class Obj {
  deftype void (*FUNC)(T); //这才是对的。。。
};

然后就是模板的使用了,今天我还直接编译实现部分的.cpp文件为一个静态库,然后另一个项目里引用头文件,再链接这个库; 发现报错了,不知道怎么加速,Google搜了下,英方的看的不是很明白,又找了个中文的文章看了下,才知道, 模板类的声明和实现要放在一起。。 顺便学到了一招:

// xx.h
template <class Obj>
class Aa {
public:
  Aa();
  //...  
};

#include "xx.cpp"


////////////////////////////
// xx.cpp
template <class Obj>
Aa<Obj>::Aa() {
  //..
};

一直以来,我一直认为#include "xx"就是来引用头文件的,发现原来.cpp也可以include进来, 应该是什么文件都可以引进来的吧。。被一直以来的思维误导了。。 然后在头文件里和.cpp里模板里加上:

#ifndef __XX_H__
#define __XX_H__
//..文件内容写在这里面来
#endif

不然重复引用又要悲剧了。。

坑爹,写个文章居然用了一个小时了,快11点了。。睡觉睡觉去。。

Comments: