C++要点记录
关键词解释
重载: 指在同一个类中相同的返回类型的方法名,但是参数的个数和类型可以不同。
覆盖:指子类重写父类的虚函数。
多态:c++多态是通过虚函数来实现的,父对象可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是:允许父类类型的指针指向子类对象,间接调用子类对象的函数。
隐藏:(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。
虚析构函数:虚析构的作用是允许子类继承该父类,在delete子类时,会调用父类的析构函数。如果父类析构函数不加visual的话,是不会被调用的。
CRT :c/c++ run-time library,是C/C++程序运行时需要的库。
char *p = “plato”;
p[4] = ‘c’; //错误,给常量赋值,结果无意义;
char p[] = “plato”;
p[4] = ‘c’; //可以
函数
void fn(int a){ static int sVal = 1; }//sVal只会初始化一次
malloc 和 calloc 的区别 :malloc分配的内存没有初始化,而calloc分配后的内存有初始化。
函数未确定数目的参数
在参数表的最后用省略号(...)结束。例: int printf(const char * ...);
例:
#include <stdarg.h>
void error(int severity, ...)
{
va_list ap;
va_start(ap, severity);
for(;;)
{
char *p = va_arg(ap, char *);
if(p == 0) break;
cerr<<p<<' ';
}
va_end(ap);
cerr<<'\n';
}
指针
int *ap[15]; //15个到int的指针的数组
函数指针
typedef int(FUNC1)(int);typedef int(FUNC2)(int*,int*,int*);
重载的运算符
二元运算符可以定义为取一个参数的非静态成员函数,也可以定义为取两个参数的非成员函数。如果两者都有定义,那么就按照重载解析来确定究竟应该用哪个定义。
对于一元运算符,无论他是前缀的还是后缀的,都可以定义为无参数的非静态成员函数,或者定义为取一个参数的非成员函数。
例:
inline bool operator == (A a1, A a2);
bool operator != (A, A); bool operator < (A, A);
bool operator > (A, A); bool operator ++ (A &a1);
ostream& operator<<(ostream& ,const A& )
istream& operator>>(istream& ,const A& )
A(const A &); //复制构造函数
A &operator = (const A &a1); //复制赋值
A &operator + (const A &a1); //
A &operator [] (const int &); //
A &operator () (const int &); //
A &operator++(); //前缀
A &operator++(int); //后缀 int参数绝对不会用,虚设的。
A &operator--(); //前缀
A &operator--(int); //后缀 int参数绝对不会用,虚设的。
例:
class A
{
public:
A(int v){m_Val = v;};
int m_Val;
};
class Ptr_to_A
{
public:
Ptr_to_A(A *a1)
{
m_pA = a1;
}
A* operator->(){return m_pA;}; //-> 重载
A &operator*() {return *m_pA;}; //* 重载
A &operator[](int i){return m_pA[i];}; //[] 重载
private:
A *m_pA;
};
Ptr_to_A pA(new A(1));
pA.operator->()->m_Val 与 pA->m_Val 与 (*pA).m_Val 与 pA[0].m_Val 等效。
易错点
临时对象
void fn(string s1, string s2)
{
const char *cs = (s1+s2).c_str();
cout<<cs;
//为了保持s1+s2将会产生一个临时对象,随之从这个对象里提取一个指向C风格字符串的指针。在表达式结束时,这个临时对象将被删除。那么由c_str()返回的那个C风格字符串就有可能异常。
}
auto_ptr 可以用指针去初始化,且能以与指针同样的方式间接访问。还有就是,在auto_ptr 退出作用域时,被它所指的对象将隐式地自动删除。例:
void fn()
{
std::auto_ptr<A> p(new A(1));
std::cout<<p->m_Val;
}
auto_ptr 被拷贝或被赋值后,其已经失去对原对象的所有权。
虚继承
http://blog.csdn.net/wangxingbao4227/article/details/6772579
为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。这样不仅就解决了二义性问题,也节省了内存,避免了数据不一致的问题。
class 派生类名:virtual 继承方式 基类名
类对象的结构与析构,构造是一个自下而上的过程,析构则自上而下。