C++ 类&对象

类的构造函数

类的构造函数和类的名称完全相同,没有任何返回值,可以为某些成员变量设置初始值

#include <iostream>
 
using namespace std;
 
class Line
{
   public:
      void setLength( double len );
      double getLength( void );
      Line();  // 这是构造函数
 
   private:
      double length;
};
 
// 成员函数定义,包括构造函数
Line::Line(void)
{
    cout << "Object is being created" << endl;
}
 
void Line::setLength( double len )
{
    length = len;
}
 
double Line::getLength( void )
{
    return length;
}
// 程序的主函数
int main( )
{
   Line line;
 
   // 设置长度
   line.setLength(6.0); 
   cout << "Length of line : " << line.getLength() <<endl;
 
   return 0;
}
  • 可以带参数,需要在创建对象时给对象赋初始值

  • 可以使用初始化列表

    Line::Line( double len): length(len)
    {
        cout << "Object is being created, length = " << len << endl;
    }
    
    C::C( double a, double b, double c): X(a), Y(b), Z(c)
    {
      ....
    }
    

类的析构函数

析构函数和类的名称完全相同,前面加~作为前缀,没有任何返回值,也不能带参数。有助于在跳出程序之前释放资源

#include <iostream>
 
using namespace std;
 
class Line
{
   public:
      void setLength( double len );
      double getLength( void );
      Line();   // 这是构造函数声明
      ~Line();  // 这是析构函数声明
 
   private:
      double length;
};
 
// 成员函数定义,包括构造函数
Line::Line(void)
{
    cout << "Object is being created" << endl;
}
Line::~Line(void)
{
    cout << "Object is being deleted" << endl;
}
 
void Line::setLength( double len )
{
    length = len;
}
 
double Line::getLength( void )
{
    return length;
}
// 程序的主函数
int main( )
{
   Line line;
 
   // 设置长度
   line.setLength(6.0); 
   cout << "Length of line : " << line.getLength() <<endl;
 
   return 0;
}

C++ struct

和C不同,C++在定义结构体时省略关键词struct

C++不提倡使用外部变量,但提倡使用外部结构声明

可以使用列表初始化

struct和class的区别

在C中,因为struct是一种数据类型,那么就肯定不能定义函数,所以在面向c的过程中,struct不能包含任何函数。否则编译器会报错。面向过程的编程认为,数据和数据操作是分开的。然而当struct进入面向对象的c++时,其特性也有了新发展,就拿上面的错误函数来说,在c++中就能运行,因为在c++中认为数据和数据对象是一个整体,不应该分开,这就是struct在c和c++两个时代的差别。

在C++中struct得到了很大的扩充:

1.struct可以包括成员函数

2.struct可以实现继承

3.struct可以实现多态

二.strcut和class的区别

1.默认的继承访问权。class默认的是private,strcut默认的是public。

2.默认访问权限:struct作为数据结构的实现体,它默认的数据访问控制是public的,而class作为对象的实现体,它默认的成员变量访问控制是private的。

3.“class”这个关键字还用于定义模板参数,就像“typename”。但关建字“struct”不用于定义模板参数

4.class和struct在使用大括号{ }上的区别

关于使用大括号初始化

1.)class和struct如果定义了构造函数的话,都不能用大括号进行初始化
  2.)如果没有定义构造函数,struct可以用大括号初始化。
  3.)如果没有定义构造函数,且所有成员变量全是public的话,class可以用大括号初始化

基类&派生类

class derived-class: access-specifier base-class

base-class:之前定义的某个类的名称

access-specifier:是public/protected/private其中的一个,base-class是之前定义过的某个类的名称,若不使用,默认是private

访问控制和继承

派生类继承了所有基类方法,除去:

  • 基类的构造函数、析构函数和拷贝构造函数
  • 基类的重载运算符
  • 基类的友元函数
继承类型

几乎不使用protected和private继承

公有继承:基类的公有成员是派生类的公有成员,基类的保护成员是派生类的保护成员,基类的私有成员不能直接被派生类访问。

多继承

一个子类可以有多个父类,继承多个父类的特性。C++类可以从多个类继承成员

class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,...
{
};

Virtual Function & Override

virtual function在基类中被声明,在继承类中被override

Override关键字帮助防止在覆盖虚函数时出现一些问题

http://c.biancheng.net/view/1561.html

在函数头添加override关键字

class Base
{
    public:
        virtual void functionA(int arg) const { cout << "This is Base::functionA" << endl;}
};
class Derived : public Base
{
    public:
        virtual void functionA(int arg) const override{ cout << "This is Derived::functionA" << endl; }
};

Virtual Function vs Pure Virtual Function

reference

Virtual Function的介绍如上,virtual function makes it a polymorphic(多形的) base class. Derived classes can override virtual functions and will be resolved at run-time.

Pure virtual function e.g.

virtual bool f() const = 0;

That makes the class it defined for abstract and can not be instantiated. Derived class need to override or implement all inherited pure virtual functions.

函数重载

函数重载的关键是函数的参数列表,也就是函数的特征标。如果两个函数的参数数目和类型相同,同时参数的排列顺序也相同,那他们的特征标是一致的,而变量名无关紧要。

编译器在检查函数特征标时,将类型引用和类型本身视为同一个特征标。

匹配函数时,不区分const和非const变量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值