首页 > 编程语言 >C++类和对象(类的定义)

C++类和对象(类的定义)

时间:2024-08-12 21:51:52浏览次数:8  
标签:定义 对象 成员 C++ month int year day

目录

一· 类的定义

1.1 类的定义格式

1.2 访问限定符(public、private、protected)

1.3 类域


一· 类的定义

1.1 类的定义格式

  • 定义类的关键字是 class类定义结束时,后面的分号不能省略。
  • 类体中的内容称为类的成员:①类中的变量称为类的属性或成员变量;②类中的函数称为类的方法或者成员函数。

注意:为了更好的区分成员变量,一般习惯上成员变量会加一个特殊标识,例如 _name。 

  • 定义在类里面的成员函数默认为inline。
  • C++中struct也可以定义类,C++兼容C中struct的⽤法,同时struct升级成了类,明显的变化是
    struct中可以定义函数,⼀般情况下我们还是推荐⽤class定义类。

类的定义代码示例:

class
{
    //成员函数
    void Init(int year,int month,int day)
    {
        _year = year;
        _month = month;
        _day = day;
    }
    //成员变量  为了区分成员变量,习惯上加一个特殊标识
    int _year;
    int _month;
    int _day;
}; // 分号不能省略

1.2 访问限定符(public、private、protected)

  • 访问限定符是C++⼀种实现封装的⽅式,⽤类将对象的属性与⽅法结合在⼀块,让对象更加完善,通过访问权限选择性的将其接⼝提供给外部的⽤⼾使⽤。
  • public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访问。

通过代码来看更方便我们理解:

class Data
{
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void print()
	{
		cout << _year << "/" << _month << "/" << _day <<endl;
	}
	int _year;
	int _month;
	int _day;
};

int main()
{
	Data d1;
	d1.Init(1, 1, 1);
	d1.print();
	return 0;
}

通过编译器编译会报错:不可访问

 

现在我们用public修饰编译

class Data
{
public:
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void print()
	{
		cout << _year << "/" << _month << "/" << _day <<endl;
	}


public:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Data d1;
	d1.Init(1, 1, 1);
	d1.print();
	return 0;
}

我们通过编译器编译能够看出,通过public修饰之后不会报错,能够直接访问!!!

  • 访问权限作⽤域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为⽌,如果后⾯没有访问限定符,作⽤域就到 }即类结束。
  • class定义成员没有被访问限定符修饰时默认为private,struct默认为public。

1.3 类域

类定义了⼀个新的作⽤域,类的所有成员都在类的作⽤域中,在类体外定义成员时,需要使⽤ :: 作⽤域操作符指明成员属于哪个类域。

通过代码来看更方便我们理解:

#include<iostream>
using namespace std;
//这个声明我们放到了 Stack.h 的文件
class Stack
{
public:
    // 成员函数
    void Init(int n = 4);
private:
    // 成员变量
    int* array;
    size_t capacity;
    size_t top;
};

//这个定义我们放到了 Stack.cpp 的文件
void Stack::Init(int n)  //这里需要注意:声明和定义分离,需要指定类域,用 :: 去指定
{
    array = (int*)malloc(sizeof(int) * n);
    if (nullptr == array)
    {
        perror("malloc申请空间失败");
        return;
    }
    capacity = n;
    top = 0;
}

类域影响的是编译的查找规则,下⾯程序Stack.cpp文件中的Init如果不指定类域Stack,那么编译器就把Init当成全局函数,那么编译时,找不到array等成员的声明/定义在哪⾥,就会报错。

指定类域Stack,就是知道Init是成员函数,当前域找不到的array等成员,就会到类域中去查找。

标签:定义,对象,成员,C++,month,int,year,day
From: https://blog.csdn.net/2301_77331799/article/details/141123643

相关文章

  • 【C++面向对象】泛型编程(模板) 新手小白都能懂!
    目录泛型编程是什么?模板和泛型编程的关系?函数模板定义调用类模板定义调用总结/小注泛型编程是什么?顾名思义,“泛型”即“广泛的类型”,即不拘泥于一种特定类型的编程方法。在泛型编程时,我们通常使用一个或多个类型占位符来表示一种或多种类型,这些类型对于模板而言......
  • 类和对象(中)
    ......
  • 4.自定义的信号和槽
    自定义信号1.写到signal下2.返回void3.需要声明,不需要实现4.可以有参数,可以重载自定义槽函数1.返回void2.需要声明,也需要实现3.可以有参数,可以重载4.写到pulicslot下或者pulic或者全局函数触发自定义的信号1.emit自定义信号案例:下课后,老师触发饿了信号,学生响应信号......
  • 《NET CLR via C#》---第五章(基元类型,引用类型和值类型,对象相等性和同一性,对象哈希码)
    基元类型编译器直接支持的数据类型称为基元类型(primitvietype),基元类型直接映射到Framework类库(FCL)中存在的类型。例如,C#的int直接映射到System.Int32类型。因此,以下4行代码都能正确编译,并生成完全相同的IL:inta1=0;//最方便的语法System.Int3......
  • Java中类与对象的学习上
    类与对象类和对象的概念类定义对象的蓝图,包括属性和方法。具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。类具有操作,......
  • c++两人组合账号
    周小灵彤:周小灵彤(六年级)-CSDN博客王小灵弘:wanghongyv-CSDN博客这是联合账号,因为我们俩懒太勤快了(嘻嘻)                                                     ......
  • NDT算法详解与C++实现
    点云匹配在感知环节是一个很重要的信息获取手段,而其中的算法也有几个比较经典了,例如ICP(IterativeClosestPoint,迭代最近点)算法,而本文决定记录学习的是NDT算法,也就是NormalDistributionTransform,正态分布变换算法。什么是正态分布变换算法呢,简言之,就是把空间中的点云进行整......
  • C++基础知识:友元是什么,友元(全局函数做友元)
    在程序里,有些私有属性也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术友元的目的就是让一个函数或者类访问另一个类中私有成员通俗一点说就是友元,就好比你的闺蜜,你可以让他了解你身上的特有的东西友元的关键字为friend全局函数做友元代码测试:#include......
  • 保姆级下载C++17
    一、下载MSYS2MSYS2是一款跨平台编译套件,方便的帮助我们安装环境,下面是MSYS的官网:MSYS2https://www.msys2.org/下载完成后安装,安装的路径千万不要有中文,把你安装的路径复制一下,以便后续步骤。二、安装GCC安装完成后打开刚才复制的路径,点开msys2.exe,输入以下命令来安装GCCp......
  • [AI]YOLO如何训练对象检测模型(详细)
    一、我们为什么要训练YOLO?        尽管官方的预训练模型已经能够识别一些最基本的物体了,但是我们想让模型识别一些特殊的模型或者我们想给一些物体添加权重,让模型更倾向于去把这个物体框出来,官方的底模是做不到的。我们在这时就不得不对底模重新进行训练了。通过训练......