您的位置:首页 > 编程语言 > C语言/C++

c++面对对象基础知识

2015-04-10 15:29 316 查看
一、类的定义格式

class calss_name
{
private:
data member declarations;
public:
member functions;

}


二、构造函数

1、在程序声明对象时,将自动调用构造函数

2、c++提供两种构造函数初始化对象的方式

显示调用构造函数:Person stucent = Person("张三","四川大学","大三",22);

隐式调用构造函数:Person studnet("李四","四川大学","大三",22);

构造函数与new

Person * pstudent = new Person("王五","四川大学","大三",22);

这条语句创建了一个person对象,其初始化为参数提供的值,并将改对象的地址赋值给pstudent指针,在这种情况下,改对象没有名称,但可以使用指针来管理改对象。

在构造函数构造对象之前,对象是不存在的,因此构造函数被用来创建对象,而不能通过对象来调用

三、析构函数

析构函数的作用:完成清理工作

如果构造函数使用new 分配内存,那么需要使用析构函数 delete释放内存

析构函数没有参数和返回类型,不能被重载

四、访问控制

1、c++的类中的成员变量的默认访问权限是private

2、c++中的struct默认访问权限是public

五、运算符

1、作用域解析运算符 :: 函数来使用

用来标识函数所属的类

2、直接成员运算符 . 对象来使用

用来直接调用对象的成员属性或者成员函数

3、间接成员运算符 -> 指向对象的指针使用

用来间接调用对象的成员属性或者成员函数

六、const成员函数

作用:

为了保证函数不会修改调用对象。

格式:

声明格式 返回值 函数名() const

定义格式 返回值 类名:函数名() const

只要类方法不修改调用对象,就应该声明为 const 成员函数

七、this指针

this指针指向用来调用成员函数的对象。一般情况下,所有的类方法都将this指针设置为调用它的对象的地址

比如 person是一个类,person p;

p.getName(),this指针指向的是p对象

如果方法需要引用整个调用对象,使用表达式*this

八、对象数组

person p[5] =
{
person("张三",20,"男"),
person("李四",22,"男"),
person("王五",24,"男"),
......
};


九、类作用域

1、作用域为类的常量

方法一:在类的声明中声明一个枚举,这种方法声明的枚举并不会创建类数据成员,也就是说,所有的对象都不包括枚举。同时,不需要提供枚举名称。

class bakery
{
private:
enum {months = 12};
double costs[month];
};


方法二:static

class bakery
{
private:
//enum {months = 12};
static const int month = 12;
double costs[month];
};


2、c++ 11作用域内枚举

enum egg {small,medium,large};

enum t_shirt {small,medium,lager};

这样无法通过编译,因为命名冲突

c++ 11 提供的解决机制:

enum class egg {small,medium,lager};

enum class t_shirt {small,medium,lager};

也可以使用struct 代替class,然后使用枚举名限定枚举量

egg choice = egg::large

十、使用类

1、运算符重载

格式:返回值 operatorop(argument list)

比如:operator+(),operator[]()

2、友元

1、友元有三种

友元函数

友元类

友元成员函数

2、创建友元函数

声明:

friend Time operator*(double m,const Time & T); (Time是一个类)

虽然函数是在类声明中声明的,但不是成员函数,也不能使用成员运算符调用

虽然不是成员函数,但他与成员函数的访问权限相同(可以访问私有成员 变量)

定义:

Time operator*(double m,const Time & T)//不需要friend

{

}

3、常用的友元

<<运算符重载

friend void operator<<(std::ostream & os, const Person & p);

void operator<<(std::ostream & os, const Person & p)
{
os<< p.name <<"\t"<< p.age << endl;
}


4、友元函数不受访问权限的限制

1)友元函数可以访问类的private,protected,public的所有字段属性

2)友元函数被放在类的任何位置,结果一样

3)友元类

3.1、如果某类B的成员函数频繁的存取另一个类A的数据成员,而A的数据成员peivate/protected限制造成B存取的麻烦,B只能通过A的public的成员接口间接存取

3.2、把B做成A类的友元类,即A类向B类开放其private/protected内容,让B直接存取

3.3、友元类:一个类可以做另一个类的友元,友元类的所有成员函数都是另一个类的友元函数

3.4、定义 friend class class_name;

十一、类和动态内存分配

1、特殊成员函数

1、c++默认提供一下成员函数

默认构造函数(如果没有定义构造函数)

默认析构函数(如果没有定义构造函数)

复制构造函数(如果没有定义构造函数)

赋值运算符(如果没有定义构造函数)

地址运算符(如果没有定义构造函数)

2、复制构造函数(拷贝构造函数)

作用:用于将一个对象复制到新创建的对象中,它用于初始化过程中,而不是常规的赋值过程中。

一般的原型如下:

ClassName(const ClassName & obj);

2.1何时调用?

新建一个对象并将其初始化为同类现有对象时,复制构造函数将被调用

程序生成对象副本时,包括参数按值传递时

按引用传递参数时,不会调用复制构造函数

2.2有何作用?

默认的复制构造函数逐个复制非静态成员

3、c++ 11提供的另外两个特殊的成员函数

移动构造函数

移动赋值运算符

4、带参数的构造函数也可以是默认构造函数------------->当所有的参数都有默认值。但是只能有一个默认构造函数

5、当定义了构造函数,c++不会定义默认构造函数

6、如果类的数据成员是char* s类型的字符串

Person(const char* s);
Person::Person(const char* s)
{
len = std::strlen(s);
str = new char[len + 1];
std::strcpy(str, s);
}

Person::~Person()
{
delete[] str;
}


7、成员初始化列表

1、Person(std::string name, unsigned int age) :name("weixuan"),age(20){}

这种格式只能用于构造函数

必须用这种格式来初始化非静态const数据成员

必须用这种格式初始化引用数据成员

2、 不能在类声明中初始化静态成员变量

例外情况:静态数据成员是整型或者枚举型const

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: