递归/迭代
递归:直接或间接调用自己的函数
迭代:用现在的值,代到一个公式里面,算出下一个值,再用下一个值代入公式,如此往复地代。比如:x=(x+2/x)/2
类的成员函数可以使用类的任何成员,而不管其访问级别,不是类的组成部分的代码不能访问private成员
用class和struct关键字定义类的唯一差别在于默认访问级别:struct的成员为public,而class的成员为private
头文件一般包含类的定义、extern变量的声明和函数的声明,头文件用于声明而不是用于定义,因为头文件包含在多个源文件中,所以不应该含有变量或函数的定义,但是有三个例外:头文件可以定义类、值在编译时就已经知道的const对象和inline函数
string::size()返回值是string::size_type类型的
cout << "qqqqqqq" + hello + "wwwwwwww" << endl;
+两边必须有一个是string变量,否则返回的新对象无法接收
Const int ic; //非法:定义const对象必须进行初始化
Const int *pic; //合法:定义了指向int型const对象的指针pic
Int * const cpi; //非法:cpi被定义为指向int型对象的const指针,但并没有初始化
平均来说,使用string类型的程序执行速度要比c风格字符串的快很多,因为使用c风格字符串的程序需要自己管理内存的分配和释放,而使用string类型的程序由系统自动进行分配和释放,因此比使用c风格的程序要简短,执行速度也要快一些
int ival;
double dval;
const string *ps;
char *pc;
void *pv;
//用命名的强制类型转换符号重写下面语句:
(a) pv = (void *)pa;
(b) ival = int(*pc);
(c) pv = &dval;
(d) pc = (char*)pv;
//解答:
(a) pv = static_cast<void*> (const_cast<string*> (ps));
(b) ival = static_cast<int> (*pc);
(c) pv = static_cast<void*> (&dval);
(d) pc = static_cast<char*) (pv);
通过引用传递数组:f(int (&arr)[10]) //下标优先级高,数组非引用传值都是传递的指针
标准c中没有引用,c++中有,所以带引用的.c文件gcc编译不通过
编译器隐式的将在类内定义的成员函数当做内联函数,类的成员函数可以访问该类的private成员
每个成员函数(除了static成员函数外)都有一个额外的、隐含的形参this。在调用成员函数时,形参this初始化为调用函数的对象的地址,如:
total.same_isbn(trans);
Sales_item::same_isbn(&total, trans);
Double avg_price() const;
成员函数声明的形参表后面的const:改变了隐含的this形参的类型,在调用total.same_isbn(trans)时,隐含的this形参将是一个指向total对象的const Sales_Item*类型的指针
用这种方式使用const的函数称为常量成员函数。由于this是指向const对象的指针,const成员函数不能修改调用该函数的对象。因此,函数avg_price和函数same_isbn只能读取而不能修改和调用它们的对象的数据成员
Const对象、指向const对象的指针或引用只能用于调用其const成员函数,如果尝试用它们来调用非const成员函数,则是错误的
形参是引用或指针,则不能将const对象传递给非const形参,其他都可以
返回指向函数的指针
int (*ff(int))(int*, int);
阅读函数指针声明的最佳方法是从声明的名字开始由里而外理解
先观察ff(int),将ff声明为一个函数,它带有一个int型的参数。该函数返回
int (*)(int*, int)类型的指向函数的指针,所指向的函数返回int型并带有两个分别是int*和int型的形参
使用typedef可以是该定义更简明易懂:
typedef int (*PF)(int*, int);
PF ff(int)
允许将形参定义为函数类型,但函数的返回类型则必须是指向函数的指针,而不能是函数
具有函数类型的形参所对应的实参将自动转换为指向相应函数类型的指针。但是,当返回的是函数时,同样的转换操作则无法实现,如:
void f1(func); //ok
func f2(int); //error
func *f3(int); //ok
只有支持复制的元素类型可以存储在vector或其他容器里,由于流对象不能复制,因此不能存储在vector或其他容器中
形参或返回类型也不能为流类型。如果需要传递或返回io对象,则必须传递或返回指向该对象的指针或引用