您的位置:首页 > 编程语言 > C语言/C++

c++令本人困扰的地方

2016-03-16 18:39 309 查看

1.sort

对于vector可以直接用,list却必须传递cmp比较函数

2.iterator

模板中,(
template<typename T>
)

vector::iterator itera;

似乎只能在while循环体内进行迭代器自增,不能在for括号内进行迭代器自增

例如:

vector<int> the_vector;
vector<int>::iterator the_iterator;
for( int i=0; i < 10; i++ )
the_vector.push_back(i);
int total = 0;
the_iterator = the_vector.begin();
while( the_iterator != the_vector.end() ) {
total += *the_iterator;
the_iterator++;
}
cout << "Total=" << total << endl;


但是特别的要说明的是,当类型变量(T)作为参数导出iterator时(vectot::iterator)*,为了编译通过

需要

typename vector<T>::iterator itera;


此时迭代器itera可以在for,while循环里使用

template <typename T> void vector_print(vector<T>v){
typename vector<T>::iterator itera;

for(itera=v.begin();itera!=v.end();++itera){
cout<<*itera<<"   ";
}
}


3.有默认参数的函数

带默认参数的函数声明时注明默认参数即可,当声明与定义分离时,不能在定义中再指定一个默认值(即使与声明的是同一个值)


4.EOF

cstdio也即stdio.h才有这个宏定义


5.const

函数名后加const

bool Stack:: isempty()const;//声明
bool Stack:: isempty()const{}//定义


事实上,在函数名后加const只会出现在类的方法定义上,表明这个方法成员不可变,

又因为this是隐藏的第一个参数,所以实质要求是方法不能修改实例的属性isempty、isfull

front、back等都可以后面加const预防意外修改实例属性。

6.模板定义应该与声明放在同一个头文件里

对于某些实现了export关键字的编译器可以分开放、头文件放声明,export模板

定义单独放在一个源文件里,包含头文件。(反正gcc、vs都没有实现,)

7.类初始化中的单引号

本条援引 /article/8938499.html

初始化的顺序与成员变量声名的顺序相同。

先看一下下面的程序:

myClass::myClass():b(1),a(b)

{

}

这样的执行结果a,b各是多少呢?b=1,a=1?不是,b=1而a是个随机数。这一点是相当重要的哦,一般在初始化列表中进行初始化时,初始化的顺序应与声明的顺序保持一致,防止出现不必要的错误。

3)对于继承的类来说,在初始化列表中也可以进行基类的初始化,初始化的顺序是先基类初始化,然后再根据该类自己的变量的声明

为什么呢,因为:

myClass::myClass()

{

a = 1;// 没错,效果相当于在初始化列表中进行初始化

b = 1;// 出错,const变量不能进行赋值操作;

}

8.静态(static)成员初始化

参见这篇博文:

/article/5674687.html

9.明明直觉上同Java那么像,但创建对象的思路迥异!!

C++ 对象只要声明变量, 就算创建, 但是要考虑栈上的对象与堆上的对象的不同, 栈对象会回收

堆对象需要 new 与 delete ……

总之C++就是四不像

10. C++多态性是通过虚函数来实现的

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: