| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3921 人关注过本帖
标题:C++类的介绍
只看楼主 加入收藏
雪影辰风
Rank: 6Rank: 6
来 自:衡阳市
等 级:贵宾
威 望:22
帖 子:177
专家分:387
注 册:2019-6-17
结帖率:75%
收藏
 问题点数:0 回复次数:14 
C++类的介绍
    如果我们要编写一个程序,用来记录学生的信息【比如:姓名、年龄、性别...】,如果我们对应所要记录的每个信息都开辟一个数组,那么这个程序显然变得冗余复杂,这是有人会想到用struct结构体定义,这是一种有效的方法,但struct毕竟存在一定的功能限制,这时我们就可以引入C++提供的一种全新的管理思想和封装模式——类(class)

1.类的定义:
    class 类名 {
    成员变量;
    成员函数;
    }
    成员函数在定义时,我们不必在类的定义代码中定义,而在类的外部定义,这里我们要注意一个新的符号——"::"域解析操作符
    类名::函数名 {
        代码块;
    }

2.成员的访问类型
    首先我们要明白什么是成员,想必大家都知道,不论是结构体还是类,其中所包含的变量、常量、函数、重载运算符,都是这个结构体或者类的成员。
    什么是访问类型?
在类中,我们提供了三种访问类型:
    public:        private:        protected:
    这三个访问类型是如何控制的?
  (1)public:
    公有(公开)成员,类的外部调用、内部成员均可访问
  (2)private:
    私有成员,只允许类的内部成员访问
  (3)protected:
    保护成员,只允许类的内部成员以及派生类的成员访问(有关派生类的概念以后再解释)
  E.g.
    我们定义一个类:
程序代码:
    class CTest {
        public:
            void show();
        private:
            int tot;
    }
    void CTest::show() {
        printf("%d",tot);
    }

    【由于这是对类的介绍,protected就不做举例,因为这需要基类与派生类的概念】
      那么我们就对其进行调用,我们定义一个CTest实例,名为a,则有如下:
    a.show();  //这是正确的调用
    printf("%d",a.tot);  //这是错误的调用
  【那么具体的访问类型请大家自行实验,这里不做过多解释】

3.静态成员的引入
    那么什么是静态成员呢?
    在类的使用时,我们有些数据是需要做到实例间的共享,这里就需要将成员定义成静态成员,我没用static关键字来定义:
    static 数据类型 成员变量;
    static 数据类型 成员函数;
    静态的成员变量不属于任何一个实例,我们在给静态成员变量初始化时应当以以下格式进行初始化:
    数据类型 类名::变量名=值;
    同样,静态的成员函数也不属于任何一个实例,我们在定义静态成员函数时要注意:静态成员函数如果想要调用本类的成员变量,只能调用静态的变量,因为静态成员是不需要实例就可以进行调用的,而动态成员需要实例才会为其分配内存空间,所以在静态成员函数中调用非静态变量会报错。
    静态成员函数定义格式如下:
    数据类型 类名::函数名 {
        语句块;
    }
    我们现在已经知道了静态成员的定义了,那么究竟如何使用?我们来模拟一下:
程序代码:
#include<cstdio>
using namespace std;
class CTest {
    public:
        void show() {
            printf("%d\n",tot);
        }
        void add() {
            tot++;
        }
    private:
        static int tot;
};
int CTest::tot=0; //初始化tot
int main() {
    CTest a,b; //我们定义了两个CTest实例
    a.add();
    a.show();
    b.show();
    b.add();
    a.show();
    b.show();
    return 0;
}

以上代码的运行结果为:
1
1
2
2
    由此我们就可以知道static成员是可以做到数据跨实例共享的
【那么这里就先给大家介绍到这里,C++类如果掌握的好是非常有用的,很多语言像C#、Java等都是用类来实现的,甚至包括MFC也是以类为基础】
搜索更多相关主题的帖子: 成员 静态 变量 函数 定义 
2020-02-23 12:54
雪影辰风
Rank: 6Rank: 6
来 自:衡阳市
等 级:贵宾
威 望:22
帖 子:177
专家分:387
注 册:2019-6-17
收藏
得分:0 
不好意思各位,在“1.类的定义”中的“成员函数的外部定义”那里写错了
“类名::函数名 {”应改为“数据类型 类名::函数名 {”
2020-02-23 13:16
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
收藏
得分:0 
太深奥了,
我才学到变量,现在正在学全局变量,等我学到这再请教你吧

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-02-23 13:35
雪影辰风
Rank: 6Rank: 6
来 自:衡阳市
等 级:贵宾
威 望:22
帖 子:177
专家分:387
注 册:2019-6-17
收藏
得分:0 
没事,这些东西本来就不是一般做OI该学的,只不过我喜欢干别的,所以我们队里我OI不是最好的,但是其余的知识我是最丰富的
再一个这个文章本来我就是随便写写的
2020-02-23 13:52
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
收藏
得分:0 
那个多个文件怎么运行啊,我卡在内联全局变量那了,编译器运行不了我就不知道对错了
比如这两个文件
程序代码:
constants.h
#ifndef CONSTANTS_H
#define CONSTANTS_H

 
// define your own namespace to hold constants
namespace constants
{
    inline constexpr double pi { 3.14159 }; // note: now inline constexpr
    inline constexpr double avogadro { 6.0221413e23 };
    inline constexpr double my_gravity { 9.2 }; // m/s^2 -- gravity is light on this planet
    // ... other related constants
}
#endif
main.cpp:
#include "constants.h"

 
int main()
{
    std::cout << "Enter a radius: ";
    int radius{};
    std::cin >> radius;

 
    std::cout << "The circumference is: " << 2 * radius * constants::pi;
}



把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-02-23 18:09
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
收藏
得分:0 
算了,我还是问大部队吧

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-02-23 18:13
return_0
Rank: 8Rank: 8
来 自:五维空间
等 级:禁止访问
威 望:3
帖 子:512
专家分:838
注 册:2020-1-28
收藏
得分:0 
加油奥里给

2020-03-06 12:32
maomao12345
Rank: 2
来 自:五位神奇空间
等 级:禁止访问
威 望:2
帖 子:127
专家分:64
注 册:2020-3-23
收藏
得分:0 
不错,看到大佬很努力,向你学习
我认真的看了下来,愣是没看懂

一个快乐的小小孩
2020-03-24 10:18
万致远醉帥
Rank: 2
等 级:论坛游民
威 望:1
帖 子:88
专家分:35
注 册:2020-3-24
收藏
得分:0 
我做了一个这个
#include<iomanip>
#include<iostream>
#include<string>
using namespace std;
class nate
{
public:
    void set(int age, string name)
    {
        aaage = age;
        nnname = name;
    }
    void hh()
    {
        if (nnname == "nate" || nnname == "万致远" || nnname == "柯向红" || nnname == "kathy")
        {
            cout << nnname << "最好看" << endl << aaage << "岁";
        }
        else
        {

            cout << nnname << "最丑最胖最脑残" << aaage << endl << "岁";
        }
    }

private:
    int aaage = 0;
    string nnname = 0;
};


int main()
{
    string nname;
    int aage;
    cin >> nname >> aage;
    nate n1;
    n1.set(aage, nname);

    n1.hh();
    while (true)
    {
        ;
    }
    return 0;

}

我们遇到什么困难,也不要怕,微笑着面对他,消除恐惧的最好方法就是面对恐惧。
2020-03-26 11:41
万致远醉帥
Rank: 2
等 级:论坛游民
威 望:1
帖 子:88
专家分:35
注 册:2020-3-24
收藏
得分:0 
怎么样?


我们遇到什么困难,也不要怕,微笑着面对他,消除恐惧的最好方法就是面对恐惧。
2020-03-26 11:41
快速回复:C++类的介绍
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018364 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved