Más contenido relacionado
La actualidad más candente (19)
Similar a xwz 2010-10-31 (20)
xwz 2010-10-31
- 4. C++语法篇(1)- explicit
explicit 显示调用构造函数,单参数构造函数使用
class String
{
◦ explicit String(int size);
◦ String(const char*p);
};
String s1 = ‘a’; //不可以
String s2(10); //OK
String s3 = “abc”; //期待的形式
- 5. C++语法篇(1)- explicit
class IntChildClassrray{
public:
◦ IntChildClassrray(int size);
};
IntChildClassrray a(10);
IntChildClassrray b(10);
for(int i=0; i<10; ++i)
if(a==b[i]) //What happened?
……
- 7. C++语法篇(3)-强制类型转换
static_cast
就咱这编译器,基本告别C模式转换
double d=50.0;
int i = (int)d; //在C++中过时了
int i = static_cast<int>(d);//More safe
const_cast
去掉const和volatile属性,除非万不得已,不然还是远离它
void f(const TypeChildClass* a)
{
◦ TypeChildClass* b=a; //Error
◦ TypeChildClass* b=const_cast<TypeChildClass*>(a); //终
于编译过了,最好不要这么做,如果你像更改,直接定义成非const的最
好
}
- 8. C++语法篇(3)-强制类型转换
dynamic_cast
多态必备,运行时检查,主要用于基类向派生类转换.
class ChildClass:public BaseClass{};
BaseClass* ptr;
ChildClass* a = dynamic_cast<ChildClass*>(ptr); //可以,More
safe
ChildClass* a = static_cast<ChildClass*>(ptr); //可以,More speed
class ChildClass:virtual public BaseClass{};
BaseClass* ptr;
ChildClass* a = dynamic_cast<ChildClass*>(ptr); //可以
ChildClass* a = static_cast<ChildClass*>(ptr); //不可以
void *ptr;
MyClass* a = dynamic_cast<MyClass*>(ptr);//不可以
a = static_cast<MyClass*>(ptr); //可以,但是后果不堪设想
- 13. C++语法篇(6)-访问权限知多少
class B:public A
{
public:
inline void f()
{
value = a.value;
}
inline void h(A &c)
{
value = c.value;
}
private:
A a;
};
- 14. C++应用篇(1)-模板的应用
模板类和函数的定义,用处不大,编程使用较少
模板类和函数的调用却处处可见:STL,boost
STL应用的建议(PC机上肯定试用,嵌入式选择性借鉴):
1.尽量使用模板,如:变长数组,排序,搜索,!!!字符串类型String.抛开任何内存和效率的顾虑
放心大胆的使用STL吧.
2.尽量不要尝试性在工程中使用自己实现的类STL库,你不会比STL写的更完美,更安全,更高
效.
3.sgi版本的模板跨平台性更强,实现更为广泛.
4.仿函数在模板中应用很广( 应用(3) ).
5.list<int>和list<double>完全是两个豪不相关的类,非继承关系,模板工作于编译阶段效
率很高.
6.struct Token{char*;enum} 用map吧!
7.迭代器中 <containter.end() 和 !=containter.end()不一样,一定要用后者!
8.当返回值为两个时, 还在使用A f(B*);吗,看来你OUT了,现在流行 pair<A,B> f();
9.++i效率高于i++, x+=y效率高于x=x+y(相差不多无关紧要)
10.STL的作用域都是std,在工程中尽量不要用using namespace std;会产生命名空间冲
突,可以用using std::cout; using std::cin;
- 15. C++应用篇(2)-C方法 vs C++方法
PC机平台强烈建议(嵌入式平台选择性建议):
1.尽量使用C++的new 和delete替代malloc和free,如果你
想用realloc可能vect更适合你.
2.多用流控制吧,比如cout替代printf,cin替代scanf,fstream
替代fopen.使用方便,并且方便和STL结合.
3.尝试用cstdio代替stdio.h,cstdlib代替stdlib.h还有其它的C
标准库也是.在C++中,类内部使用全局函数需要加上,比
如::fopen,::fwrite(与编译器相关).
4.inline,enum和const代替宏,仿函数代替指向函数的指针.
5.C++ lib不是万能的,但是C++却可以让我们不付出任何代
价的调用C lib,不用白不用.
6.不要去担心语言差异的效率问题,C只比C++快那么一点点.
而使用得当的面向对象可以把你的编程效率提高好几倍,好的
框架也可以为今后的扩展和维护省下一大笔人力,资金和时间.
- 17. C++应用篇(4)-循环只做它该做的
老祝语:万恶的strlen,可恶的for循环.
for( ; ; )
{
◦ a[i] = strlen(str) + i;
}
int len = strlen(str);
for( ; ; )
{
◦ a[i] = len + i;
}
万恶的临时变量:
for( ; ; )
{
◦ int temp = 0; //我不属于这里,放到for循环之外
◦ temp = a[i];
◦ a[i]= b[i];
◦ b[i] = temp;
}
- 18. C++应用篇(5)-Qt and MFC are C++
无论是Qt还是MFC,你首先要记住它先是C++,然后
才是Qt或者MFC.所以你必须遵守C++的一切规则.
无论用Qt还是MFC亦或是别的GUI库,STL可以
用,C++的一切语法和特性在这都可以用.立足于我在
写的是C++程序,调用了Qt或者MFC类库.
当Qt或者是MFC库中没有你想要的东西的时候,记得
回归C++思想去解决问题,写lib的人也不可能面面俱
到.它没办法把每一个人的需求全部考虑到.而且C++
的开源库都是可以用进来帮助你解决问题的.
一个”Qt的Assistant”引发的血案!