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

    文章

    4329

    浏览量

    62588
  • C++
    C++
    +关注

    关注

    22

    文章

    2108

    浏览量

    73636
  • 数据类型
    +关注

    关注

    0

    文章

    236

    浏览量

    13623
收藏 人收藏

    评论

    相关推荐

    C++的结构和

    C++ 有结构,就像 C 一样,因为它们是不一样的。C++,它们与结构非常相似。本文解开这些语言元素的细节。
    发表于 07-18 17:37 806次阅读

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

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

    CC++const的用法比较

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

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

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

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

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

    C++语言基础讲解视频常量的定义和使用

    C++语言基础讲解视频常量的定义和使用,喜欢的朋友可以下载来学习。
    发表于 01-14 15:30 4次下载

    变量定义和声明的区别

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

    高质量C++C编程指南资料说明

    每个 C++/C 程序通常分为两个文件。一个文件用于保存程序的声明(declaration),称为头文件。另一个文件用于保存程序的实现(implementation),称为定义(def
    发表于 03-14 08:00 2次下载

    C语言的声明定义与引用说明

    本文档的主要内容详细介绍的是C语言的声明定义与引用说明
    发表于 07-29 08:00 2次下载
    <b class='flag-5'>C</b>语言的<b class='flag-5'>声明</b>和<b class='flag-5'>定义</b>与引用说明

    C++的继承访问级别学习总结(二)

    上一篇文章我们介绍了c++的继承学习总结;今天我们继续来分享c++的继承
    的头像 发表于 12-24 16:10 740次阅读

    EE-128:C++的DSP:从C++调用汇编成员函数

    EE-128:C++的DSP:从C++调用汇编成员函数
    发表于 04-16 17:04 2次下载
    EE-128:<b class='flag-5'>C++</b><b class='flag-5'>中</b>的DSP:从<b class='flag-5'>C++</b>调用汇编<b class='flag-5'>类</b>成员函数

    EE-112:模拟C++实现

    EE-112:模拟C++实现
    发表于 05-27 16:13 2次下载
    EE-112:模拟<b class='flag-5'>C++</b><b class='flag-5'>中</b>的<b class='flag-5'>类</b>实现

    虚函数,C++开发者如何有效利用

    虚函数是基声明的成员函数,且使用者期望在派生中将其重新定义。那么,在 C++
    的头像 发表于 02-11 09:39 941次阅读

    C语言如何定义结构体类型变量

    定义了结构体变量后,系统会为之分配内存单元。根据结构体类型包含的成员情况,在Visual C++占63个字节。 * 这种声明方式是
    的头像 发表于 03-10 15:35 1326次阅读

    ostream在c++的用法

    ostream 是 C++ 标准库中一个非常重要的,它位于 头文件(实际上,更常见的是通过包含 头文件来间接包含 ,因为 包含了 和 )。 ostream 及其派生
    的头像 发表于 09-20 15:11 698次阅读