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();读取换行符但不把它抛弃

浙公网安备 33010602011771号