【C++】类与对象(上)(二)

简介: 【C++】类与对象(上)


四、类的访问限定符及封装

1.访问限定符

当然,在类中呢,C++还提出了一些其他的东西,public和private:

class Stack // 类型
{
public:
  void Push(int x)
  {
    // Init();
    //...
  }
  void Init(int N = 4) //缺省参数
  {
    // ...
    top = 0;
    capacity = 0;
  }
private:
  int* a;  
  int top;
  int capacity;
};

简单地说就是,private是私有,他只能在自己的类中去使用,而public在内外都可以使用,没有限制,这就更好的去使对象完善,方便内外去管理权限并使用。

【访问限定符说明】

1. public 修饰的成员在类外可以直接被访问

2. protected 和 private 修饰的成员在类外不能直接被访问 ( 此处 protected 和 private 是类似的)  

3. 访问权限作用域从该  访问限定符  出现的位置开始直到下一个访问限定符出现时为止

class Stack // 类型
{
public:
    void Push(int x)
    {
        // Init();
        //...
    }
    void Init(int N = 4)
    {
        // ...
        top = 0;
        capacity = 0;
    }
//private:
    int* a;
    int top;
    int capacity;
};

若有private,则public的作用域到private,private的作用域到结尾。


若没有,则直接到结尾,整个都为公开public。


5. class 的默认访问权限为 private , struct 为 public( 因为 struct 要兼容 C)

   这就是为什么,struct中,变量访问结构体中的值,可以随便访问。

2.封装

面向对象的三大特性:封装、继承、多态。(最重要的三个特性)

在类和对象阶段,主要是研究类的封装特性,那什么是封装呢?

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来

和对象进行交互。

封装本质上是一种管理,让用户更方便使用类。 一种管理方式。

举例说明:

在C语言中,实现栈时,大家如果都很遵循规则,访问栈顶元素时,就会调用Top函数,但是总会有人直接去 打印st.a[top],但是可能此时的top不一定是栈顶,可能也是栈顶的前一个,每个人实现的方式都不同,所以就会出现问题。


但是在C++中,就体现了封装的作用,是一种管理,就会将类的成员变量设置为私有private,就不会让你去访问,只是通过函数接口来访问,这样就不会出现问题。  

五、类的作用域和命名空间区别

类定义了一个新的作用域,类的所有成员都在类的作用域中在类体外定义成员时,需要使用::

作用域操作符指明成员属于哪个类域。

class Person
{
public:
 void PrintPersonInfo();
private:
 char _name[20];
 char _gender[3];
 int  _age;
};
// 这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{
 cout << _name << " "<< _gender << " " << _age;
}

那就会有人想,可不可以这样使用  Person::_age = 1;不是命名空间域访问里面的变量时,就可以通过域操作符来访问吗?


但是这里是有区别的,命名空间域相当于设置了一堵围墙,他将里面的变量围了起来,只能通过域操作符来访问到里面变量,函数等,但是类的作用域(类域)它是一堵虚拟墙,他没有实体,就相当于加了密码锁的一张图纸,没有实质内容的,必须按照图纸造出对象以后,才可以通过域操作符来访问。


类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图 ,只设

计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象

才能实际存储数据,占用物理空间

目录
相关文章
|
17天前
|
编译器 C++
C++ 类构造函数初始化列表
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。
60 30
|
6天前
|
并行计算 Unix Linux
超级好用的C++实用库之线程基类
超级好用的C++实用库之线程基类
12 4
|
6天前
|
C++ Windows
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
|
6天前
|
C++
2合1,整合C++类(Class)代码转换为MASM32代码的平台
2合1,整合C++类(Class)代码转换为MASM32代码的平台
|
6天前
|
存储 运维 监控
超级好用的C++实用库之日志类
超级好用的C++实用库之日志类
12 0
|
1月前
|
C++
C++(十一)对象数组
本文介绍了C++中对象数组的使用方法及其注意事项。通过示例展示了如何定义和初始化对象数组,并解释了栈对象数组与堆对象数组在初始化时的区别。重点强调了构造器设计时应考虑无参构造器的重要性,以及在需要进一步初始化的情况下采用二段式初始化策略的应用场景。
|
1月前
|
存储 编译器 C++
C ++初阶:类和对象(中)
C ++初阶:类和对象(中)
|
1月前
|
C++
C++(十六)类之间转化
在C++中,类之间的转换可以通过转换构造函数和操作符函数实现。转换构造函数是一种单参数构造函数,用于将其他类型转换为本类类型。为了防止不必要的隐式转换,可以使用`explicit`关键字来禁止这种自动转换。此外,还可以通过定义`operator`函数来进行类型转换,该函数无参数且无返回值。下面展示了如何使用这两种方式实现自定义类型的相互转换,并通过示例代码说明了`explicit`关键字的作用。
|
1月前
|
存储 设计模式 编译器
C++(十三) 类的扩展
本文详细介绍了C++中类的各种扩展特性,包括类成员存储、`sizeof`操作符的应用、类成员函数的存储方式及其背后的`this`指针机制。此外,还探讨了`const`修饰符在成员变量和函数中的作用,以及如何通过`static`关键字实现类中的资源共享。文章还介绍了单例模式的设计思路,并讨论了指向类成员(数据成员和函数成员)的指针的使用方法。最后,还讲解了指向静态成员的指针的相关概念和应用示例。通过这些内容,帮助读者更好地理解和掌握C++面向对象编程的核心概念和技术细节。
|
1月前
|
存储 C++
C++(五)String 字符串类
本文档详细介绍了C++中的`string`类,包括定义、初始化、字符串比较及数值与字符串之间的转换方法。`string`类简化了字符串处理,提供了丰富的功能如字符串查找、比较、拼接和替换等。文档通过示例代码展示了如何使用这些功能,并介绍了如何将数值转换为字符串以及反之亦然的方法。此外,还展示了如何使用`string`数组存储和遍历多个字符串。
下一篇
无影云桌面