c++(三)、对象和类(一)

一、用类创建对象

1、类的概念(concepts of class)

1)、面向对象编程(Object-Oriented Programming)特征

(1)、Abstraction(抽象)

(2)、Polymorphism(多态)

(3)、Inheritance(继承)

(4)、Encapsulation(封装)

2)、定义对象的方法

    对象是类的实例,类包含:有变量定义的数据域(data fields)和由函数定义的行为(behaviors)。

    类中有两种特殊的函数:(1)、构造函数(constructors):在创建对象时被自动调用;(2)、析构函数(destructors):在对象被销毁时被自动调用。

    构造函数简写ctor,析构函数简写dtor。

2、创建对象并访问其对象成员

1)、构造函数(ctor)

class Circle
{
public:
    double radius;
    
    //ctor
    Circle()
    {
        radius = 1.0;
    }

    //ctor
    Circle(double newRadius)
    {
        radius = newRadius;
    }

    double getArea()
    {
        return radius * radius * 3.14
    }
}

ctor的特点:

(1)、自动调用;

(2)、与类同名;

(3)、无返回值;

(4)、可重载;

(5)、可不带参数。

    另外类可不声明构造函数,编译器会提供一个带有空函数体的无参构造参数,只有当未声明构造函数时,编译器才会提供这个函数,并称之为默认构造函数。

2)、创建对象

//无参数;
Circle c1;//正确;
Circle c2();//错误,c++编译器认为这是一个函数声明;
Circle c3{};//正确,用空初始化列表初始化c3对象(调用Circle默认构造函数);

//带参数
Circle c4{5.5};//列表初始化,并带有窄化检查;

3)、对象访问云算法

点运算符(.)也称为对象成员访问运算符。

//访问Circle中的radius成员
Circle c;//定义无参数对象;
c.radius = 1.0;//用点运算符访问数据域成员radius;
double area = c.getArea();//用点运算符访问成员函数;

二、对象拷贝以及分离声明与实现

1、类是一种数据类型

    用类声明一个实体的说法与定义一个变量的说法有些不同:用原生数据类型定义变量,用类名定义对象。

//定义变量的例子
int x{2};
int x2 = {4};
auto x3{x};

//定义对象的例子
Circle c1;//调用默认ctor;
Circle c2(5.5);//调用有参ctor;
Circle c3{5.5};//列表初始化,直接调用有参ctor;

2、成员拷贝

    将一个对象的内容拷贝给另外一个对象的方法:使用赋值运算符(=);默认情况下

,对象中的每个数据域都被拷贝到另一个对象的对应部分。

Circle c1{5.5};//定义类对象c1,并用列表初始化给数据成员变量radius赋值;

Circle c2;//定义类对象c2;

c2 = c1;//用赋值运算符给c2赋值;对象c2中的radius也为5.5;

3、匿名对象(Anonymous Object)

    所谓匿名对象,是只有类名和使用列表初始化的初始值,而没有类对象名称的对象。匿名对象声明后只能使用一次。

Circle c1 = Circle{1.1};//用匿名对象做拷贝列表初始化;
Circle c3;
c3 = Circle{3.3};//用匿名对象给c3对象赋值;

4、局部类和嵌套类

    局部类是指在一个函数中声明的类;

void f()
{
    class C//C及其对象只在f()中可用;
    {
        void g()//成员函数必须在C中实现;
        {
            /*访问f()的成员受限*/
        }
    };
    
    C c1,c2;
}

    嵌套类在另一个类中声明的类

class E
{
    class F//F及其成员可访问E的成员;
    {
        
    };

    E e1,e2;
}

5、将声明与实现分离

    所谓将声明和实现分离,将类的声明放在.h文件中,将类的成员函数的实现放在.cpp中,一般.h和.cpp文件保持同名即可。

cpp文件中类的实现格式如下:

FunctionType ClassName :: FunctionName(Arguments) {/*函数实现部分*/ }

其中的::运算符为二元作用域解析云算符,简称域分隔符。

6、内敛声明与内联函数

使用方法与c语言中的内联函数一样。

当函数在类中声明时实现的函数,将自动成为内联函数。

7、避免头文件被多次包含

    为避免头文件被多次包含,可使用预处理指令,方法如下:

//method 1:
#ifndef MY_HEADER_FILE_H
#define MY_HEADER_FILE_H
//头文件内容

#endif


//method 2:
#pragma once //c++03,c90


//method 3:
_Pragma("once") //c++11,c99

三、对象指针、对象数组以及函数参数

1、对象指针与动态对象

1)、对象指针

    对象指针可以指向新的对象名,用指针访问对象成员需要用箭头运算符(->):

Circle c1;
Circle* c2 = &c1;//定义对象指针;

//用箭头运算符访问对象成员;
c2->radius = 2.0;
double area = c2->getArea();

2)、在堆中创建对象

    在函数中声明的对象都在栈上创建的,当函数返回,则对象销毁。为保留对象,可以用new运算符在堆上创建它。

Circle* c1 = new Cirlce{};//无参构造函数创建对象;

Circle* c2 = new Circle{5.9};//用有参函数创建对象;

//当程序结束时,动态对象会被销毁,或者用delete显式销毁;
delete c1;
delete c2;

2、对象数组(Array of Objects)

对象数组的声明有如下几种方式:

//method 1:
Circle c1[10];

//method 2:
Circle c2[3] = {Circle{3}, Circle{}, Circle{5}};
//注意:声明数组时不能用auto;

//method 3:
Circle c3{3.1, {}, 5};

//method 4:
auto* c4 = new Circle[3];
auto* c5 = new Circle{3.1, {}, 5};

delete [] c4;
delete [] c5;
c4 = c5 = nullptr;

3、对象还可作为函数参数和返回值。(不再赘述)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值