【摘要】
面向对象主要的知识点有,面向对象的基本概念,结构和类的区分,多态及各种构造函数。要求掌握 1.面向对象的基本原则(封装、继承、多态),面向对象的基本概念(类、对象、继承)。2.类和结构体在访问控制上的差异。3.成员变量在静态成员变量的4个特性、引用成员变量必须采用的初始化方式、静态常量成员变量的初始化特点以及成员变量在初始化列表初始化顺序上的特点。 4. string与stack的四个初始化函数的书写。 5. 友元函数的尺度以及实现。 6.异常的2个例题要求熟练掌握。 7. 深拷贝与浅拷贝的概念,知道为什么会有拷贝,为什么会有深拷贝,怎样实现深拷贝。 8. 多态与重载、隐藏、模板的比较,多态中最重要的一句话是什么,多态是面向对象中十分关键的知识点,要非常熟悉!!!9.纯虚函数的产生原因,以及定义方式,熟练掌握。
【正文】
面向对象的一些概念
public,
protected, private,
这三个属性的访问权限依次降低;。
继承实现了模块扩展,代码重用;类和结构
【例】
Test a (1); // 初始化类对象 Test b ( ); // 错误的初始化 a.fun ( ); b.fun ( );
成员变量
静态成员变量
详址 http://blog.csdn.net/u013630349/article/details/46414007
【注】
下例在VS2010中是执行成功的
class Myclass
{
private:
static const int period = 30; // interest posted every 30 days
}
VS2010 中,只有静态常量整型数据成员才可以在类中初始化,成员变量、静态成员变量在类中是不能够初始化成功的。
VC6.0中,静态常量整型数据成员、静态成员变量、成员变量都不可在类中初始化;【见下例小结】
【例】
成员函数初始化列表示例
class A
{
...
int func: val_a (a),val_b(b),val_c(c) { ... }
...
} ;
class test
{
private:
int a; 普通成员
constint b; 常量成员
staticint c; 静态成员
staticconstint d; 静态常量成员
int &e; 引用类型成员
}
记住下面几个原则:
1)常量成员(注意没有静态常量成员)和引用类型成员只能用成员初始化列表对成员变量初始化
2)静态成员和静态常量成员由于是类共有的,不是属于某一个对象的,因此不能在构造函数中初始化
3)静态成员(注意没有静态常量成员)必须在类外初始化
4)引用变量必须初始化才能使用
5)只有静态常量成员才能在类中直接赋值初始化
6)初始化列表初始化变量顺序根据成员变量的声明顺序来执行,而和在程序中赋值先后顺序无关
class test
{
int a=1; 错误,对象还没有构造,尚未分配内存空间
int a;
const b;
static int c = 1; 错误,不可以再声明时初始化
static int c;
const static int d = 1; 唯有静态常量成员才能在类中直接赋值初始化
int &e; 引用类型必须用成员初始化列表
public:
test(int _e):b(1),e(_e); 引用初始化必须为左值
test(int _e):b(1),e(_e){};
};
int test::c=1;
const int test::d=1;
构造函数与析构函数
构造函数可以有一个参数也可以有多个参数,构造函数可以重载,即定义多个参数个数不同的函数;但是析构函数不指定数据类型,也没有参数,且一个类中只能定义一个析构函数,不能重载。
析构函数会被自动调用的两种情况:①当这个函数结束时,对象的析构函数被自动调用;②当一个对象使用new运算符被动创建时候,在使用delete运算符释放它,delete将会自动调用析构函数。
【自己胡诌】析构函数设计为虚函数的原因是当基类对象析构时,可以将子类一并析构掉;
【官方解释】析构函数设计为虚拟类型是为了所有派生类的函数都可以自动的变为虚拟类,从而避免因析构函数未被调用而导致的内存泄露问题。
【自己胡诌】虚函数是一种需要知道部分成分才能工作的函数机制,也就是对象需要被创建出来,但是构造函数是在对象还没有被构造出来的时候形成的。所以,不能采用虚函数机制。
【官方解释】因为虚调用是一种在要有部分信息的情况下才能工作的机制,允许我们调用一个只知道接口而不知道其准确对象类型的函数。但是,要创建一个对象,必须知道所建对象的类型,因此不能使用虚函数;
【官方解释】因为每一个虚函数的对象都必须维护一个虚函数表,产生一定系统开销。如果创建的类不需要派生其他类别,根本没必要使用虚函数
a) X& b) const X& c) volatile X& d) const volatile X&。
【内联函数示例】
inline void fun ()
{
...
}
拷贝函数与赋值函数
详见 :深拷贝 与 浅拷贝
详址:http://blog.csdn.net/u013630349/article/details/46317987
1.函数的返回值是对象
2.函数的输入参数是对象
3.采用已有对象初始化新的对象
MyClass &A = (MyClass &B);
MyClass &A(MyClass &B);
理解默认拷贝构造函数
【程序】
#include<iostream>using namespace std;
class B
{
private:
int data;
public:
B()
{
cout<<"defualt constructor"<<endl;
}
~B()
{
cout<<"destructed "<<endl;
}
B( int i) : data(i)
{
cout<<"constructed by parameter"<<data<<endl;
}
};
B Play( B b )
{
return b;
}
int main ()
{
B temp = Play(5);
return 0;
}
1)该程序输出结果是什么?为什么会有这样的输出?
2)B(int i):data(i),这种用法的专业术语叫什么?
3)Play(5),形参类型是类,而5是个常量,这样写合法吗?为什么?
(1)输出结果如下:
constructed by parameter 在Play(5)处,5通过隐含的类型转换调用了B::B( int i )
destructed Play(5) 返回时,参数的析构函数被调用
destructed temp的析构函数被调用;temp的构造函数调用的是编译器生存的拷贝构造函数,这个需要特别注意
(2)带参数的构造函数,冒号后面的是成员变量初始化列表(member initialization list)
(3)合法。单个参数的构造函数如果不添加explicit关键字,会定义一个隐含的类型转换;添加explicit关键字会消除这种隐含转换。
多态、重载、模板
C++ 覆盖 重载 隐藏 浅析
http://blog.csdn.net/u013630349/article/details/46706299
指针的类型是实函数的类型,指向对象的类型是虚函数的类型。
纯虚函数
1)为什么会有纯虚函数?
为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数
方法:virtual ReturnType Function()= 0;
编译器要求在派生类中必须予以重写以实现多态性。同时含有纯虚拟函数的类称为抽象类,它不能生成对象。这样就很好地解决了上述两个问题。
2)纯虚函数是什么,怎样定义?
纯虚函数是定义在基类中的虚函数,它在基类中无定义,要求任何派生类自己去实现该方法,在基类中纯虚函数的形式如下:virtual void func( ) = 0;
【初始化 赋值 定义 声明 的 区别】
【答疑】
MSBD P 123.5 ~ 127.1 ~ 128.2 ~129.10.8
多态指针
tchar.h
_tmain
接口,接口重用?
constvolatile
【复习要点】
http://blog.csdn.net/to_xidianhph_youth/article/details/38906367
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u013630349/article/details/48005699