C++雾中风景2:struct还是class?

之前因为都在忙着毕业的开题答辩与投稿论文的事宜,一直没有时间更新这个系列的文章。师弟看了上一篇雾中风景的文章,希望我继续把这个系列的文章写下去。坦白说,C++的特性很多,这也不是教学指南的文章,我会选取一些自己在学习C++过程之中值得探讨的问题和大家聊一聊,来抛砖引玉。好的,今天先放点开胃菜,和大家聊聊strcut与class关键字。

1.struct关键字:

在C++语言作为C语言的一个超集,但是并不兼容C语言的所有语法规则的。C语言是我学习的第一门编程语言,相对于对其中的语法规则比较熟悉,C语言之中可以使用struct关键字来将基础数据类型进行组合,实现很多类型如图,树等高级的数据结构。

下面我们简单回顾一下C语言之中的struct的用法:

struct Node {    // 定义了一个树节点
    int val;
    struct Node* left;
    struct Node* right;
};

int main() {
    struct Node root = {2,NULL,NULL}; //可以使用{a,b,c}的方式直接赋值
    cout << root.val << endl;

    return 0;
}

我们用了一段很简单的代码,就定义出了C语言之中树的数据结构。显然,使用struct Node作为类型定义十分冗长,我们这时候可以引出typedef这位仁兄。

typedef struct {
    int val;
    struct Node* left;
    struct Node* right;
}Node ;

int main() {
    Node root = {2,NULL,NULL}; //可以直接用Node定义类型了
    cout << root.val << endl;

    return 0;
}

恩,这个用法很简单吧。一开始学习C++时,我天真的以为这就是struct的用法了。但是我们不要忘了,C++可是一门面向对象的语言,C++的设计者利用了struct关键字添油加醋了。于是我在学习C++异常处理的部分,看到的这段代码。

struct MyException : public exception {
  const char * what () const throw () {
    return "C++ Exception";
  }
};

struct定义的结构是作为一个类来使用了,还可以继承,包含函数了。没错,在C++中struct关键字摇身一变,已经不再是C语言中的吴下阿蒙了,它几乎和class关键字的效果是一样的。唯一不同的地方在于:

  • 通过struct关键字实现的类,属性,函数默认的访问权限为public
  • 通过class关键字实现的类,属性,函数默认的访问权限为private

所以如果上面的代码需要将关键字从struct改为class,需要改动的内容也很简单,就是显式添加public的访问权限:

class MyException : public exception{
 public:
  const char * what () const throw () {
    return "C++ Exception";
  }
};

2.非C++语言程序员的想法:

上述struct与class的区别又是一道很好的面试题目,但是?!我不喜欢这种设计,显然,无论在何种情况下,显式的指明访问权限才是一个好的编码习惯,利用语言本身的规则来做的访问控制,并不是一种十分高明的方式。

  • Golang 定义类的方式如下,仅有一种:
type TreeNode struct {
      Val int
      Left *TreeNode
      Right *TreeNode
  }

依靠首字母的大小写区分访问控制,并没有额外的坑。

  • Python 定义类的方式如下,也仅有一种:
class TreeNode:
    def __init__(self,x):
        self.val = x
        self.left = self.right = None

Python没有访问控制

  • Java JAVA有很多类,枚举类,匿名类,还有接口等关键字。但是没有依靠定义类关键字来改变访问控制属性的方式。
  • Scala 类似于JAVA,通过伴生对象object代替了静态类功能。总体大同小异,访问控制更加灵活,也更加严格。

3.小结:

JAVA之父曾经说过:我遗漏了操作符重载相当个人选择因为我见过太多的人在 C++ 滥用它。 所以Java至今也没有支持操作符重载。(语法糖写了一时爽,滥用之后会带来很多团队协作的问题) 所以今天这篇文章表达了一下我个人的观点,C++之中有太多纷繁复杂的特性了,很多时候我们可能会因为一时的便利而使用了一些很不好的特性。struct就应该如同字面的内容一样,是一个简单使用的结构体,而如果我们要使用类,还是应该拿起class关键字。至于访问权限,就四个字 显式指定

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CSDN技术头条

Python编程中的反模式

这篇文章收集了我在Python新手开发者写的代码中所见到的不规范但偶尔又很微妙的问题。本文的目的是为了帮助那些新手开发者渡过写出丑陋的Python代码的阶段。为...

2076
来自专栏java一日一条

Java集合框架综述

近被陆陆续续问了几遍HashMap的实现,回答的不好,打算复习复习JDK中的集合框架,并尝试分析其源码,这么做一方面是这些类非常实用,掌握其实现能更好的优化我们...

841
来自专栏编程

让你比95%的人更懂Pythonic的内置模块:collections

Python的集合(collections)模块,为很多用其他方法很难实现的场景提供了解决方案。 本文我们将会学习该模块的抽象概念是如何产生的,日后处理不同问题...

1975
来自专栏大数据文摘

超8千Star,火遍Github的Python反直觉案例集!

Python,是一个设计优美的解释型高级语言,它提供了很多能让程序员感到舒适的功能特性。

992
来自专栏小俊博客

Nginx的location规则迷之匹配

Nginx,一个改变世界的软件,其作者是一个俄罗斯人,俗称毛子,在国人的印象中,是一群晚饭后牵着大灰熊在小区楼下散步的彪汉。能写出这般顺滑的软件,可谓是心有猛虎...

6152
来自专栏Java爬坑系列

【Java入门提高篇】Day16 Java异常处理(上)

  异常嘛,顾名思义就是不正常,(逃),是Java程序运行时,发生的预料之外的事情,它阻止了程序按照程序员的预期正常执行。

35612
来自专栏IT派

Code | Python30个编程技巧!

1. 原地交换两个数字 Python 提供了一个直观的在一行代码中赋值与交换(变量值)的方法,请参见下面的示例: ? 3. 使用三元操作符来进行条件赋值 三元...

3584
来自专栏程序员互动联盟

java到底和C++有啥区别?

作为一名C++程序员,我们早已掌握了面向对象程序设计的基本概念,而且Java的语法无疑是非常熟悉的。事实上,Java本来就是从C++衍生出来的。 然而,C++和...

3656
来自专栏Python学习心得

​ Python爬虫--- 1.4 正则表达式:re库

原文链接:https://www.fkomm.cn/article/2018/7/20/19.html

1170
来自专栏积累沉淀

Java设计模式(十四)----模板方法模式

模板方法模式 一、概述 二、结构 三、具体案例 四、优缺点和设计思想 一、概述 模板方法模式是类的行为模...

2205

扫码关注云+社区

领取腾讯云代金券