0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++中的类的定义和声明

jf_78858299 来源:月下西楼 作者: QStack 2023-04-06 14:42 次阅读

背景

当我们在编写程序时,经常需要定义一些数据类型,这些数据类型可以封装数据和函数,以便我们更好地组织和管理代码。C++中的类就是一种用于定义新的数据类型的机制,它允许我们将数据和函数封装在一起,形成一个独立的模块,这个模块可以被其他代码重复使用。

类的定义和声明

类是一种用户自定义的数据类型,它可以包含数据成员和成员函数。数据成员是类的属性,成员函数是类的行为。类定义了一种新的数据类型,我们可以使用这种数据类型来创建对象,每个对象都有自己的数据成员和成员函数,在C++中,我们使用class关键字来定义一个类。类的定义包括类名、数据成员和成员函数。下面是一个简单的类定义的例子:

class Person {
public:
    // 成员函数
    void sayHello() {
        std::cout << "Hello, world!" << std::endl;
    }
private:
    // 数据成员
    std::string name;
    int age;
};

在这个例子中,我们定义了一个名为Person的类,它有一个公有成员函数sayHello和两个私有数据成员name和age。公有成员函数可以被任何代码访问,而私有数据成员只能被类的成员函数访问。

构造函数

在C++中,构造函数是一种特殊的成员函数,用于初始化对象的数据成员。构造函数的名称与类的名称相同,没有返回类型,可以有参数。当创建一个对象时,构造函数会自动调用,以初始化对象的数据成员。

class MyClass {
public:
    int publicVar;
    MyClass(int var) {
        publicVar = var;
    }
};

在上面的示例中,MyClass类有一个带有一个整数参数的构造函数,用于初始化publicVar数据成员。当创建一个MyClass对象时,可以传递一个整数参数来调用构造函数,以初始化publicVar数据成员。

❝需要注意的是,如果一个类没有定义构造函数,则编译器会自动生成一个默认构造函数。默认构造函数没有参数,不执行任何操作,只是将对象的数据成员初始化为默认值。

如果一个类有多个构造函数,则可以使用函数重载来实现。函数重载是指在同一个作用域内定义多个函数,它们具有相同的名称但不同的参数列表。当调用一个重载函数时,编译器会根据传递的参数类型和数量来确定要调用哪个函数。

class MyClass {
public:
    int publicVar;
    MyClass() {
        publicVar = 0;
    }
    MyClass(int var) {
        publicVar = var;
    }
};

在上面的示例中,MyClass类有两个构造函数,一个是默认构造函数,另一个是带有一个整数参数的构造函数。当创建一个MyClass对象时,可以选择调用哪个构造函数来初始化publicVar数据成员。

析构函数

C++中的析构函数(Destructor)是一种特殊的成员函数,它在对象被销毁时自动调用。它的作用是释放对象占用的资源,比如堆上的内存、文件句柄、数据库连接等等。

C++中的析构函数使用一个波浪线(~)作为前缀,后跟类的名称。它不接受任何参数,也没有返回值,因为它的主要作用是在对象被销毁时自动执行。析构函数的名称与类名称相同,但前面有一个波浪线符号。

例如,下面是一个简单的类和它的析构函数的示例:

class MyClass {
public:
    // 构造函数
    MyClass() {
        // 构造函数代码
    }

    // 析构函数
    ~MyClass() {
        // 析构函数代码
    }
};

当程序中创建一个MyClass对象时,构造函数将被自动调用以初始化对象。当对象的生命周期结束时,析构函数将自动调用以清理对象所占用的资源。

❝需要注意的是,当一个对象被销毁时,它的析构函数会自动递归调用所有成员变量的析构函数,直到所有占用的资源都被释放为止。如果一个类中有指向堆上分配的内存的指针,需要在析构函数中手动释放这些内存,以避免内存泄漏。

实例化

在C++中,要实例化一个类,你需要创建该类的对象。这可以通过声明一个类类型的变量,然后使用new关键字调用构造函数来完成。例如,如果你有一个名为MyClass的类,你可以按如下方式创建该类的对象:

MyClass* obj = new MyClass();

这将创建一个MyClass类的新对象,并返回指向该对象的指针。然后,你可以使用->运算符访问对象的公共成员。例如,如果MyClass有一个名为publicVar的公共成员,你可以按如下方式访问它:

obj->publicVar = 42;

另外,你也可以不使用new关键字创建该类的对象。例如:

MyClass obj;

这将在堆栈上创建一个MyClass类的新对象。然后,你可以使用.运算符访问对象的公共成员。例如:

obj.publicVar = 42;

访问控制

访问控制是C++中类的一个重要概念,用于控制成员的访问权限。C++中的类可以使用public、private和protected关键字来控制成员的访问权限。其中,public成员可以被任何人访问,private成员只能被类的成员函数访问,protected成员可以被类的成员函数和派生类的成员函数访问。

友元函数

在C++中,友元函数是一种特殊的函数,它可以访问一个类的私有成员和保护成员。友元函数并不是类的成员函数,因此它不能使用成员访问运算符.或->来访问类的成员。相反,它必须使用传递给它的类对象的引用来访问类的成员。

友元函数的声明需要在类的定义中进行,使用friend关键字。例如:

class MyClass {
private:
    int privateVar;
    friend void friendFunc(MyClass& obj); // 声明友元函数
};

在这个例子中,friendFunc是一个友元函数,可以访问MyClass的私有成员privateVar。注意,友元函数并不是MyClass的成员函数,因此它不能使用成员访问运算符.或->来访问MyClass的成员。相反,它必须使用传递给它的MyClass对象的引用来访问MyClass的成员。例如:

void friendFunc(MyClass& obj) {
    obj.privateVar = 42; // 可以访问私有成员
}

在这个例子中,friendFunc可以访问MyClass的私有成员privateVar,因为它被声明为MyClass的友元函数。注意,friendFunc使用传递给它的MyClass对象的引用来访问MyClass的成员。

友元函数可以是全局函数,也可以是其他类的成员函数。如果友元函数是其他类的成员函数,那么这个类必须先被定义。例如,在以下代码中,例如:

class MyClass {
private:
    int privateVar;
    friend void friendFunc(MyClass& obj); // 声明全局友元函数
    friend class FriendClass; // 声明其他类的友元类
};

void friendFunc(MyClass& obj) {
    obj.privateVar = 1; // 可以访问MyClass的私有成员
}

class FriendClass {
public:
    void friendFunc(MyClass& obj) {
        obj.privateVar = 2; // 可以访问MyClass的私有成员
    }
};

FriendClass的成员函数friendFunc被声明为MyClass的友元函数,因此它可以访问MyClass的私有成员privateVar。注意,这里的声明需要在FriendClass的定义之后进行。此外,需要注意的是,友元函数的声明只是告诉编译器这个函数是一个友元函数,它并不会影响函数的调用方式。因此,在调用友元函数时,仍然需要使用传递给它的类对象的引用来访问类的成员。例如,在以下代码中:

class MyClass {
private:
    int privateVar;
    friend void friendFunc(MyClass& obj); // 声明全局友元函数
};

void friendFunc(MyClass& obj) {
    obj.privateVar = 1; // 可以访问MyClass的私有成员
}

int main() {
    MyClass obj;
    friendFunc(obj); // 调用友元函数
    return 0;
}

虽然friendFunc是一个全局友元函数,可以访问MyClass的私有成员privateVar,但在调用friendFunc时仍然需要使用传递给它的MyClass对象的引用来访问MyClass的成员。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4142

    浏览量

    61557
  • C++
    C++
    +关注

    关注

    21

    文章

    2070

    浏览量

    73045
  • 数据类型
    +关注

    关注

    0

    文章

    230

    浏览量

    13539
收藏 人收藏

    评论

    相关推荐

    C++零基础教程之类,轻松上手C++

    编程语言C++语言
    电子学习
    发布于 :2023年01月14日 12:14:04

    C++软件工程师面试题

    1、 c++是面向对象的编程语言吗?C++虚函数(virtual) 是什么?有什么好处? (1)C++不是纯面向对象的语言,C++是面向对
    发表于 03-01 16:23

    c++冒号(:)和双冒号(::)的用法

    ()——————————————————————————————————————VC如下::是C++里的“作用域分解运算符”。比如声明了一个A,
    发表于 10-18 10:08

    关于C++的函数重载机制

    函数重载是C++的新增机制,是在同一个作用域中能声明定义多个同名字的函数.(我们知道函数的名字是函数代码块的起始地址,这个首地址能够将函数的控制权转移给这个代码块的区域).在定义多个同名函数的时候
    发表于 10-01 17:18

    CC++const的用法比较

    const的定义放在头文件。也就是说const在C++是内连接的,不会在多个编译单元之间发生冲突。如果想声明在别的地方
    发表于 11-11 10:00

    C++笔记004:C++通俗点说—— C结构体复习

    ”。-----------------------------------------------------C++定义前面看明白了,这个地方就不多说话!将结构体定义
    发表于 03-05 12:53

    MPLAB Harmony C++怎么使用

    MPLAB和谐文档(在什么是MPLAB和谐?)“MPLA-和声没有用C++测试过,因此,没有提供对这个编程语言的支持。”——对于2018来说非常令人难以置信。有人成功地使用C++和声
    发表于 09-20 09:40

    【微信精选】C++的精髓和继承就该这么理解!

    的公有成员。C++继承 以下例子:定义了一个基base,定义了一个子类sum,子类继承了基
    发表于 08-15 09:41

    如何把C++的源程序改写成C语言

    为了满足一般的运算符使用的习惯而又不会出现错误。C不支持运算符重载,可以定义一个函数实现该功能。这是一般的修改。七.其他以上就是C++
    发表于 07-08 20:51

    如何把C++的源程序改写成C语言

    别的解决办法。2)运算符重载运算符重载只是为了满足一般的运算符使用的习惯而又不会出现错误。C不支持运算符重载,可以定义一个函数实现该功能。这是一般的修改。七.其他以上就是
    发表于 07-11 09:34

    如何把C++的源程序改写成C语言

    起不同的名字,没有别的解决办法。2)运算符重载运算符重载只是为了满足一般的运算符使用的习惯而又不会出现错误。C不支持运算符重载,可以定义一个函数实现该功能。这是一般的修改。七.其他
    发表于 06-30 10:54

    如何把C++的源程序改写成C语言

    为了满足一般的运算符使用的习惯而又不会出现错误。C不支持运算符重载,可以定义一个函数实现该功能。这是一般的修改。七.其他以上就是C++
    发表于 07-05 14:59

    如何把C++的源程序改写成C语言

    的概念和特性,将C++改为C的问题,就转换成如何将类化去的问题。方法有两种:第一种是将C++
    发表于 07-07 09:31

    如何把C++的源程序改写成C语言

    别的解决办法。2)运算符重载运算符重载只是为了满足一般的运算符使用的习惯而又不会出现错误。C不支持运算符重载,可以定义一个函数实现该功能。这是一般的修改。七.其他以上就是
    发表于 11-17 10:16

    变量定义和声明的区别

    我们在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下:
    发表于 11-17 08:38 1w次阅读