• 初识类(class&struct)及C/C++封装的差异


    初识类(class&struct)

      面向对象三大特性:封装、继承和多态。其中不得不谈的就是类,通过类创建一个对象的过程叫实例化,实例化后使用对象可以调用类成员函数和成员变量,其中类成员函数称为行为,类成员变量称为属性。类和对象的关系:类是对象的抽象,对象是类的实例

     1 struct Person{    
     2     void setAge(){
     3         age = 10;
     4         cout << "age:" << age << endl;
     5     }
     6     int age;
     7 };
     8 
     9 class Animal{
    10 public:
    11 
    12     void setAge(){
    13         age = 20;
    14         cout << "animal age:" << age << endl;
    15     }
    16     int age;
    17 };

      从上面的代码中可以看出,在类内或者struct中,可以在定义成员属性前使用它。

      其实C++中struct和class中,看起来都是一样的,calss有访问权限,struct同样有三种权限,最本质区别在于:1)默认的继承访问权限。struct是public的,class是private的;2)struct作为数据结构的实现体,它默认的数据访问控制是public的,而class作为对象的实现体,它默认的成员变量访问控制是private的;3)(这个不是最本质的区别,平时提到的也比较少)“class”这个关键字还用于定义模板参 数,就像“typename”。但关键字“struct”不用于定义模板参数。

      当你觉得你要做的更像是一种数据结构的话,那么用struct,如果你要做的更像是一种对象的话,那么用class。还要强调一点的就是,对于访问控制,应该在程序里明确的指出,而不是依靠默认,这是一个良好的习惯,也让你的代码更具可读性。

    C/C++封装差异

    由于C语言struct不能写函数,因此封装时将属性和行为(姑且这样叫,和C++统一)分开处理,另外函数参数的类型检测不严格,就会导致一些意想不到的情况;C++的参数类型检测严格,且会将属性和行为定义在一起,表示具体的事物。

    类成员权限

    类的成员有三个权限:公有权限(public),私有权限(private),保护权限(protected)。

    私有权限:私有成员在类内部可以访问,类外不可访问,一般推荐将成员变量设置为私有成员;

    公有权限:类内类外都可以进行访问;

    保护权限:类内和当前类的子类可以访问,类外不可访问。

    下面的例子,可以根据三个权限,对对象的属性和行为实现只读,只写等功能。

     1 #include <iostream>
     2 #include <string>
     3 using namespace std;
     4 
     5 class Animal{
     6 public:
     7     //写入myLOve
     8     void setLove(string love){
     9         myLove = love;
    10     }
    11     //读取年龄
    12     int readAge(){
    13         return age;
    14     }
    15 
    16     //写入名字
    17     void setName(string name){
    18         myName = name;
    19     }
    20     //读取名字
    21     string readName(){
    22         return myName;
    23     }
    24 
    25 private:
    26     string myLove; //只写
    27     string myName; //读写
    28     int age = 2; //只读
    29 };
    30 
    31 void test(){
    32     Animal animal;
    33 
    34     int age = animal.readAge();
    35     animal.setName("傻猫");
    36     string name = animal.readName();
    37     animal.setLove("小二黑");
    38     cout << name << "今年" << age << "" << endl;
    39 }
    40 
    41 int main(){
    42 
    43     test();
    44     system("pause");
    45     return 0;
    46 }
  • 相关阅读:
    Sublime : python环境
    shell:遍历目录和子目录的所有文件
    Java:方法的参数是传值还是传引用
    Sublime Text:Windows下配置C 编译环境和GDB调试环境
    代码优化的一些尝试
    go:关于变量地址的疑惑
    go:结构体的可访问性
    go:channel(未完)
    H5常见问题及解决方案。
    谷歌插件大全地址
  • 原文地址:https://www.cnblogs.com/qinguoyi/p/10214797.html
Copyright © 2020-2023  润新知