1 类
类由成员变量和成员函数组成。成员变量分为静态成员变量和普通成员变量,静态成员变量是所有对象所共有的,可直接使用className::var来修改和访问。一般来说,一个类的对象所占有的内存等于其非静态成员变量的所占用的内存空间之和。
访问范围修饰符分为公开修饰符public、私密修饰符private及保护修饰符protected。公开修饰符public修饰的变量可被所有函数访问,私密修饰符private修饰的变量可被同类的成员函数访问,而保护修饰符protected修饰的变量除了可被父类访问外,还可被子类对象的成员函数访问。如下。另外,友元函数对类的所有成员变量均有访问权限,好朋友一起走,你的就是我的。
#include <iostream>
using namespace std;
class f{
private :
int a ;
protected:
int b;
public :
int c;
};
class g:public f{
int geta(){return this->a;} //error 不能访问父类的私有变量
int geta(){return this->b;}
int geta(){return this->c;}
};
int main(){
g g1;
g1.b; //error 不能在子类成员函数外访问父类的protected变量
g1.c;
f f1;
f1.a;
f1.b; //error 不能在成员函数外访问受保护变量
f1.c;
return 0;
}
构造函数。其定义形式:class name(){}当未显式定义构造函数时,系统会自动分配一个;若显式定义了构造函数,那么声明对象时,编译器会找一个与声明对象所给的参数列表相同的构造函数,若找不到,编译器便会报错。
析构函数。其定义形式:~class name(){}。析构函数一般用来回收类所开辟的内存。
函数重载。函数重载是指函数名相同,但参数列表不同的函数。若参数列表相同,但返回类型不同,不叫函数重载,而被称为函数重定义,编译器会报错的。
友元函数。若要给类A声明一个友元函数,只需要在A定义里添加friend returnType functionName();。友元函数内是可以调用类的私有变量的。
子类。class classSonName:public classFatherName{};子类不能访问父类的私有成员,另外如果在子类中定义了与父类中同名的函数,那么父类同名函数将被覆盖。
多态。多态需要结合虚函数来实现virtual,virtual关节词只出现在成员变量定义处,而不能出现在类外写函数体处。通过一个基类指针,其指向那个子类对象,就是调用哪个子类同名虚函数,指向基类对象时,则调用自身的同名虚函数。
命名空间。命名空间的定义namespace 空间名{};使用语句using namespace 空间名;空间名内的所有变量、对象、函数均可当全局变量对象函数来使用。
引用的使用方式与一般指针不同。当函数的参数列表是引用,你可以直接传变量过去,但其得到的是引用。在函数内修改变量,则会造成内存里的变量发送变化。
模板类。template <class t1,class2 t2> classname{};
2 stack
stack是指栈,遵守先进后出的原则,其沿低地址生长,与queue相反。
函数 | 介绍 |
---|---|
void pop(); | 删除栈顶元素 |
T & top() | 返回栈顶元素的引用 |
void push(const T& x) | 添加元素x |
3 queue
queue是队列,其沿高地址生长,元素只能添加到队尾,访问和删除只能作用到队头。其方法与stack相同。
4 vector
vector是向量,其主要函数有:
函数 | 介绍 |
---|---|
vector() | 将向量初始化为空 |
vector(int n) | 将向量初始化为n个元素 |
v.begin() | 返回动态数组vector第一个元素的迭代器 |
v.empty() | 判定数组是否为空 |
void insert(iterator i,iterator first, iterator last) | 将迭代器元素[first,last)插入到容器里 |
另外常用的函数包括void push_back()和void pop_back,以及size(),front(),back();
注意:插入由两个动作组成:移动和替代。
5 链表
struct listNode{
int val;
listNode *next;
listNode():next(NULL){}//默认下一个指向为NULL
};
//从头访问到尾
vector<int> v1;
vector<int> v2;
while(head!=NULL)
{
v1.push_back(head->val);//注意不要用空指针去访问元素*NULL
head = head->next;
}
for(vector<int>::iterator i=v1.end();i>v1.begin();i--)
{
v2.push_back(*(i-1));
}
return v2;
6 explicit
explicit用来阻止隐式类型转换。
什么时候隐式类型转换会发生呢?
凡是在语境中使用了某种表达式类型 T1,但语境不接受该类型,而接受另一类型 T2 的时候,会进行隐式转换 具体情况如下
1、调用以 T2 为形参声明的函数时,以该表达式作为实参;
2、运算符期待 T2,而以该表达式作为操作数;
3、初始化 T2 类型的新对象,包括在返回 T2 的函数中的 return 语句;
4、将表达式用于 switch 语句(T2 是整数类型);
5、将表达式用于 if 语句或循环(T2 是 bool)。