C++细节提醒

1.写头文件的定义文件时,如Date.h类头文件的定义文件Date.cpp时,成员函数应该加上命名空间 如:int Date::getmonth() {}  不用分号结尾。

2.每次写一个类都应该加上 如对于Date.h,要加

1 #ifndef DATE_H   //大写
2 #define DATE_H
3 
4 ....
5 
6 #endif

 3.类的静态数据成员要在类的外部定义并且不加static

 4.类的成员函数和其他函数的定义类似,注意不能再加static

5.根据谷歌风格,C++强制类型转换应该用static_cast<double>(X)

6.作业题目中遇到,当对一个商品(有属性:价格和销售量)排序时,要对价格排序,这时候如果价格一样的话,销量大的在前,那么只能对价格一样的几个产品再重新排序一次,因此需要两次遍历商品才能得出最后结果.

7.重载[]要使用引用

8.往map中插入元素使用 x.insert(make_pair(a, b));

9.当类中只有拷贝构造函数的时候要使用explicit防止死循环

10.在map中可以使用 map<string,set<string>>的嵌套类型来储存数据

然后定义一个迭代器set<string>::iterator its就可以使用如a[x].begin()来遍历第二个集合元素

11.如何简单使用algorithm里的sort,定义一个函数int cmp(const int &a, const int &b) {return a> b}

调用sort(max.max+n, cmp);

12.删除vector中的元素使用erase,用它存指针时 vector<int*>

13. setw() 设置宽度  如果要使如1.0000后面的0输出,则加入fixed

cout << setw(8) << fixed << setprecision(4)
<< a[i] << ": "<< setw(8) << b[i] << endl;

14. 一般来说,如果一个类要被另外一个类继承,而且用其指针指向其子类对象时,如题目中的A* d = new B();(假定A是基类,B是从A继承而来的派生类),那么其(A类)析构函数必须是虚的,否则在delete d时,B类的析构函数将不会被调用,因而会产生内存泄漏和异常;

15.max(a, b)函数可求两个数中大的书

16.tolower(a)换成小写  #include <cctype>

17.m.insert(pair<string, string>(s, "*** not in dictionary"));  //使用pair<xxx,xxx>(xxx,xxx)

18.map<string, string>::iterator it = m.find(s);

m.erase(it);

19.sort(vi.begin() , vi.end()); // 从小到大 

//以上只能比较已有类型,需要比较自定义类的,需在类里面写上比较函数,写法自寻
// sort(vi.begin(), vi.end(),compare()) ;

20.多继承时,参数列表后的先构造,底层的先构造

21.若没有使用虚函数,则使用基类指针指向子类的时候,通过这个指针调用的函数将使用的是基类的非虚函数,而若调用的是虚函数成员,则调用子类的函数

21.ios::showpos能让输出的正数前带“+”号

22.

showpoint / noshowpoint 是一对操作。一个开,一个关。
double a = 30;
double b = 10000.0;
double pi = 3.1416;
cout.precision (5);
cout << std::showpoint << a << '\t' << b << '\t' << pi << '\n';
cout << std::noshowpoint << a << '\t' << b << '\t' << pi << '\n';
cout << std::showpoint << a << '\t' << b << '\t' << pi << '\n';
输出:
showpoint 时是 30.000 10000. 3.1416
noshowpoint 时是 30 10000 3.1416
即当小数点后小数全是0时,可以不显示小数点和0。这里对3.1416没影响。
再 showpoint 时是 30.000 10000. 3.1416
23.getline(s, item, ';')  getline(s, item)

24.Adapter::show(gr8.begin(), gr8.end(), Show); //这种是静态全局函数 在类定义中成员函数声明为static

static void show(vector<double>::iterator beg,vector<double>::iteratorend,void (Show)(double para)) {for_each(beg, end, Show)}

 //这里的void (Show)(double para)是一个参数函数 也可以 void Show(double para)  

25.使用一个基类的指针指向一个子类的对象,如果通过这个指针调用函数的话,如果这个函数不是虚函数则会调用基类的版本,如果这个函数是虚函数的话则会调用子类的版本

26.重载++操作符的话,如果括号内有int 则重载的是后置++操作符

 27.运行时多态是通过继承和虚函数来实现的

28.

#include <iostream>
using namespace std;
class A {
    public:
        A(){
            cout << "AAAAAA" << endl;
        }
        ~A() {
            cout << "删除AAAA" << endl;
        }
};
class B {
    public:
        B(){
            cout << "BBBBBB" << endl;
        }
                ~B() {
            cout << "删除BBBB" << endl;
        }
};
class C : public A, public B {
    public:
        C(){
            cout << "CCCCCCC" << endl;
        }
                ~C() {
            cout << "删除CCCC" << endl;
        }
};
int main() {
    C c;
    return 0;   
}

 

29.要读取一行的时候使用getline(cin, ss);

但是这个函数如果前面有 cin >> n;

那么他会读取前面的换行符,而使得ss为空或(还是\n?,没去研究这个);可以再cin >> n;后面加上cin.get();读取换行符但不把它抛弃

posted @ 2014-03-09 15:25  向日葵的祈愿  阅读(217)  评论(0)    收藏  举报