设为首页 加入收藏

TOP

C++ 我想这样用(五)(一)
2015-07-20 17:53:02 来源: 作者: 【 】 浏览:4
Tags:这样
什么是面向过程我想如果你还不知道,那你绝对不是C程序员!其实我个人感觉面向过程、模块式的C 编程风格是最棒的范式,因为平时我们遇到的大多数问题,都可以用这种范式解决,而且设计相当的简洁明快,绝不拖泥带水,相反不停的折腾面向对象模型真的会让你离问题本质越来越远。不管你已经对面向过程范式多么熟悉了,C++环境下究竟还是有些不同的:
?
?
?
1.关于引用:
?
引用是现代编程语言中常有的一个概念,自然也是C++引入的新语言特性,是C++常用的一个重要内容。然而我不能不吐槽一句,难道就不能用个其他的操作符吗?于习惯使用C进行开发的朋友们,在看到c++中出现的&符号,可能会犯迷糊,因为在C语言中这个符号表示了取地址符,但是在C++中它却用来表示引用,于是乎产生了一大批混乱的写法:
?
#include
int main(void)
?
{?
  
  int a = 0; // &a = 0x0012ff60 ?
  
?
  int *p = &*(int*)0x0012ff60;
?
  printf("The value is: %d\n", *p);?
?
  return 0;
?
}
?
我真的不想贴出来,每每看到都想吐、、 总之这是一个很奇葩的现象,在一门已经有了指针这个究极武器的语言中再引入引用,真的是很混乱。我的建议是:
?
  a)如果你是C++程序员,用好你的引用吧,别来玩弄指针了;
?
  b)相反你是C程序员,那请自爱,远离引用!!至少C with Class里是禁止使用的。
?
?
?
2.new和delete的使用注意
?
差不多到目前为止,new和delete操作符是我接受的唯一的C++里面的东西,既然为了面向对象不得不接受他们,那么就一定要用好他们。
?
new用法:
?
? ? ? ? ? 1. ? ?开辟单变量地址空间
?
? ? ? ? ? ? ? ?1)int *a = new int; ?//开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new int 即为将一个int类型的地址赋值给整型指针a.?
?
? ? ? ? ? ? ? ?2)int *a = new int(5); ?//作用同上,但是同时将整数赋值为5
?
? ? ? ? ? 2. ? ? 开辟数组空间
?
? ? ? ? ? ? ? ?int *a = new int[100]; //开辟一个大小为100的整型数组空间
?
delete用法:
?
? ? ? ? ? 1. delete a; ? //释放单个int的空间
?
? ? ? ? ? 2. delete [] a; //释放int数组空间
?
一定要注意delete 和delete[] 的区别,C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。 关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为自定义类型分配和回收空间。?
?
请看下面的程序:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include ;
using namespace std;
?
class T {
public:
? T() { cout << "constructor" << endl; }
? ~T() { cout << "destructor" << endl; }
};
?
int main()
{
? const int NUM = 3;
?
? T* p1 = new T[NUM];
? cout << hex << p1 << endl;
? // ?delete[] p1;
? delete p1;
?
? T* p2 = new T[NUM];
? cout << p2 << endl;
? delete[] p2;
}
? ? ?
大家可以自己运行这个程序,看一看 delete p1 和 delete[] p1 的不同结果,我就不在这里贴运行结果了。从运行结果中我们可以看出,delete p1 在回收空间的过程中,只有 p1[0] 这个对象调用了析构函数,其它对象如 p1[1]、p1[2] 等都没有调用自身的析构函数,这就是问题的症结所在。如果用 delete[],则在回收空间之前所有对象都会首先调用自己的析构函数。基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;但是对于类对象数组,只能用 delete[]。对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间。 ? ?
?
所以一个简单的使用原则就是:new 和 delete、new[] 和 delete[] 对应使用。
?
?
?
3.函数参数默认值
?
没错,很多C程序员早就知道C++可以给函数参数分配默认值,如果调用时不指定,就用默认值。我觉得这个特性真的很不错,可以为设计API提供极大方便,然而C里面是没有的,为了我的强迫症,我还是放弃了这个特性,但放弃不代表不用了,其实用C我们也可以模拟实现这一特性,就是用最犀利的Macro!!
?
具体的做法如下:
?
复制代码
?1 #include
?2?
?3 ?
?4?
?5 enum{
?6?
?7 ? ? plain=0,italic=1,bold=2
?8?
?9 };
10?
11 ?
12?
13 void printString(const char* message, int size, int style) {
14?
15 ? ? printf("%s %d %d\n",message,size,style);
16?
17 }
18?
19 ?
20?
21 #define PRINT_STRING_1_ARGS(message) ? ? ? ? ? ? ?printString(message, 18, italic)
22?
23 #define PRINT_STRING_2_ARGS(message, size) ? ? ? ?printString(message, size, italic)
24?
25 #define PRINT_STRING_3_ARGS(message, size, style) printString(message, size, style)
26?
27 ?
28?
29 #define GET_4TH_ARG(arg1, arg2, arg3, arg4, ...) arg4
30?
31 #define PRINT_STRING_MACRO_CHOOSER(...) \
32?
33 ? ? GET_4TH_ARG(__VA_ARGS__, PRINT_STRING_3_ARGS, \
34?
35 ? ? ? ? ? ? ? ? PRINT_STRING_2_ARGS, PRINT_STRING_1_ARGS, )
36?
37 ?
38?
39 #define PRINT_STRING(...) PRINT_STR
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Codeforces Round #261 (Div. 2) 下一篇HDU 1281 棋盘游戏(二分匹配 与 ..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: