1. class和struct的区别
class和struct的用法没什么区别,只是class默认的成员变量是private,而struct默认是public。
2. printf打印一个string时不要忘记使用%s
看代码便知:
int main()
{
char string[] = “Hello c programmers %dd”;
printf(string);
return 0;
}
3. inline的好处
在实时系统中,最重要的事代码的运行速度。所以你可以采用inline关键字来减少调用一个函数并返回它的时间。例如:
inline double cube(double x)
{
return x * x * x;
}
4. gets是危险的
char string[100];
printf(“ENTER SENTENCE: ”);
gets(string);
这段代码很危险,有可能数组溢出。请使用fgets代替。fgets有两个参数可以控制。
5. c++中定义抽象类
一个类想编程抽象类,它的成员函数加virtual并没有主体(=0),这样的类不能实例化,只能被继承。
6. 拷贝构造函数
class CopiableClass
{
public:
CopiableClass (const CopiableClass& other); // 拷贝构造函数
};
拷贝构造函数应该拷贝类及其父类中所有的数据。如果你的类有指针,那就需要分配空间,假如指针是多态类型,那就应该使用多态复制方法。
7. C++中纯抽象基类就是一个合同
C++中纯抽象基类就像是实现类和用户之间的一个合同,具体怎么实现由实现类来决定。
class Contract
{
virtual short foo(void) = 0;
}
class A : public class Contract
{
short foo(void) { return 2; }
}
class B : public class Contract
{
short foo(void) { return 4; }
}
int main(int argc, char *argv[])
{
Contract *pContract = new B;
std::cout << “foo=” << pContract->foo() << std::endl;
delete pContract;
return 0;
}
8. float和double的区别
float a = 3.14f;
if (a == 3.14)
{
cout << “hello” << endl;
}
else
{
cout << “bye” << endl;
}
输出肯定是bye。因为系统默认是double。
9. 无临时变量的swap函数
void swap(int& a, int& b)
{
a ^= b;
b ^= a;
a ^= b;
}
为了保证两个变量不重叠,改为以下:
void swap(int& __restrict a, int& __restrict b)
{
assert(&a != &b);
a ^= b;
b ^= a;
a ^= b;
}
10. 无临时变量的swap函数
int a,b;
scanf("%d %d",&a,&b);
b=(a+b)-(a=b);
printf("%d %d",a,b);
11. 除法的逻辑错误
float ans = 5 / 10; // ans的数值是0,而不是0.5
12. 类型比较的问题
unsigned int u = 10;
for(int i = -1; i <= u; i++) { /*一次也不执行*/ }
13. assert()自己
#include <cassert>或者#include <assert.h>
assert(thePtrThatShouldNeverBeNull != NULL);
不想比较了,#define NDEBUG,所有的assert全部失效。
14. 在循环判断中不要用上strlen
for (int ix = 0; ix < strlen(a_str); ix++)
{
a_str[ix] = tolower((unsigned char) a_str[ix]);
}
每次循环都计算一遍,要优化。
15. int *p的定义
int* p, q是一个指针一个变量。
Int *p, *q是两个指针。
16. 优化:用乘法代替除法
乘法速度比除法速度快多了。
17. 优化:++a和a++
for(x = 0; x < 10; x++) 不如 for(x = 0; x < 10; ++x)速度快。
for(g = g_list.begin(); g != g_list.end(); ++g) 比 for(g = g_list.begin(); g != g_list.end(); g++) 快。
18. 不要在sizeof前面加正负号
cout << -sizeof(char); // 结果是4294967295
因为sizeof的返回值是unsigned int。
19. 数字转换为string
C语言:
#include <math.h>
#include <stdio.h>
char* itoa(int num)
{
int size = log10(num) + 1;
char *x = malloc(size);
snprintf(x, size, “%d”, num);
}
C++语言:
#include <iostream>
#include <sstream>
#include <string>
string itoa(int num)
{
Stringstream converter;
Converter << num;
return converter.str();
}
20. free和delete完之后要执行pointer = NULL
21. 优化:用<<来优化
a *= 100;
a = (a << 6) + (a << 5) + (a << 2);
22. 不要使用void main()
23. cin之后要清理
#include <iostream>
int main(int argc, char* argv[])
{
int age;
std::cout << "Enter your age: ";
std::cin >> age;
std::cin.ignore(); // 这句很关键
std::cout << "You entered " << age << std::endl;
std::cin.get();
}
24. strcpy不安全,尽量用strncpy
25. 优化:采用a++,a--替代a+=1,a-=1
26. gets有可能溢出,用fgets替代
27. 用STL的容器来替代c数组
28. #include <stdlib.h> system函数执行系统命令