1、什么是面向对象?
面向对象程序设计
概念:(Object Oriented Programming,缩写:OOP)是一种程序设计范型,同时也是一种程序开发的方法。 对象指的是类的实例,将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。
C++不是纯面向对象语言,而是基于面向对象的语言 (ps:因为它包含C的部分,C是面向过程)
面向对象的三大特性: 封装、继承、多态
2、类的大小?为什么要内存对齐?内存对齐的计算?空类的计算
1) 每个对象的大小为类中所有成员变量的大小之和,当然这里也遵循内存对齐原则。
内存对齐原则请查看:http://blog.csdn.net/adzn1/article/details/78619851
2)内存对齐是为了提高程序运行速度(浪费空间换时间)
3)空类的大小为1
3、隐含的this指针
4、四个默认成员函数详解
1、构造函数:
成员变量为私有的,要对它们进行初始化,必须用一个公有成员函数来进行。同时这个函数应该有且仅在顶yi时自动执行一次。
特点:
1)函数名与类名相同;
2)无返回值;
3)对象构造时系统自动调用对应的构造函数
4)可以重载
5)可在类内定义,也可在类外定义
6)若在类中没有定义构造函数,则c++编译器自动产生一个缺省的构造函数,定义了系统就不会自动产生。
7)无参的构造函数和全缺省值的构造函数都认为是缺省构造函数,并且缺省的构造函数只能有一个。
无参构造函数&带参的构造函数
class Date
{
public :
// 1.无参构造函数
Date ()
{}
// 2.带参构造函数
Date (int year, int month , int day ) {
_year = year ;
_month = month ;
_day = day ;
}
private :
int _year ;
int _month ;
int _day ;
};
void TestDate1 ()
{
Date d1 ; // 调用无参构造函数 Date d2(2015, 1, 1); // 调用带参的构造函数
}
带缺省参数的构造函数
class Date
{
public :
// 3.缺省参数的构造函数
Date (int year = 2000, int month = 1, int day = 1)
{
_year = year ;
_month = month ;
_day = day ;
}
2、拷贝构造函数
创建对象时使用同类来进行初始化,这时所用的构造函数称为拷贝构造函数,拷贝构造函数是特殊的构造函数。
特征:
1)拷贝构造函数其实是一个构造函数的重载。
2)拷贝构造函数的参数必须使用引用传参,使用传值方式会引发无穷递归引用。
3)若未写,系统会默认缺省的拷贝构造函数,依次拷贝类成员进行初始化。
class Date
{
public :
Date()
{}
// 拷贝构造函数
Date (const Date& d)
{
_year = d ._year;
_month = d ._month;
_day = d ._day;
}
private :
int _year ;
int _month ;
int _day ;
};
void TestDate1 ()
{
Date d1 ;// 下面两种用法都是调用拷贝构造函数,是等价的。
Date d2 (d1); // 调用拷贝构造函数
Date d3 = d1; // 调用拷贝构造函数
}
3、析构函数:
当一个对象的生命周期结束时,C++编译系统会自动调用一个成员函数,这个特殊的成员函数即析构函数
特征:
1、析构函数在类名加上字符~;
2、析构函数无参数无返回值。
3、一个类有且只有一个析构函数,若未显示,系统会自动生成缺省的析构函数
4、对象生命周期结束时,c++编译系统自动调用析构函数
5、注意析构函数体内并不是删除对象,而是做一些清理工作
先构造后析构,后析构先构造
class Date
{
public : // 析构函数
~Date()
{}
private :
int _year ;
int _month ;
int _day ;
};
EXP0
class Array
{
public :
Array (int size)
{
_ptr = (int *)malloc( size*sizeof (int));
}
// 这里的析构函数需要完成清(shi)理(fang)工(kong)作(jian)。
~ Array ()
{
if (_ptr )
{
free(_ptr );
_ptr = 0;
}
}
private :
int* _ptr ;
};
4、运算符重载:
为了增强程序的可读性,C++支持运算符重载。
运算符重载特征:
1. operator+ 合法的运算符 构成函数名(重载<运算符的函数名:operator< )。
2. 重载运算符以后,不能改变运算符的优先级/结合性/操作数个数。
笔试题考点 5个C++不能重载的运算符:
.*/::/sizeof/?:/.
【赋值运算符重载】
拷贝构造函数是创建的对象,使用一个已有对象来初始化这个准备创建的对象。 赋值运算符的重载是对一个已存在的对象进行拷贝赋值。
class Date
{
public :
Date()
{}
// 拷贝构造函数
Date (const Date& d)
_year(d._year)
_month(d._month)
_day(d._day)
{}
// 赋值操作符的重载
// 1.思考为什么operator=赋值函数需要一个 Date&的返回值,使用void做返回值可以吗?请验证
Date& operator = (const Date& d)
{
// 2.这里的if条件判断是在检查什么?
if (this != &d)
{
this->_year = d. _year;
this->_month = d. _month;
this->_day = d. _day;
}
return *this ;
} private:
int _year ;
int _month ;
int _day ;
};
void Test ()
{
Date d1 ;
Date d2 = d1; // 调用拷贝构造函数
Date d3 ;
d3 = d1 ; // 调用赋值运算符的重载
}