首页 > 其他分享 >面向对象学习笔记(避雷篇)

面向对象学习笔记(避雷篇)

时间:2023-09-24 16:01:18浏览次数:51  
标签:初始化 调用 函数 避雷 笔记 面向对象 int Example 构造函数

面向对象学习笔记(避雷篇)

时间还挺快的,当年的 OIer 已经上大学啦!在大学的 C++ 学习中,要求我们掌握两种编程技巧,即面向对象和面向过程。

因为高中时期不管是 CSP 还是 NOIp 的比赛,大家用的基本上都是面向过程的设计思路,因此我开学后就着重开始学习面向对象的方法。

这里对面向对象的概念不做细致的讨论了。总之,复杂的也用不到,现在的水平只能做到 “封装” 这一项。

下面来整理一下最近写代码时候遇到的困难和解决办法。

在类外调用类内的静态函数

大多数时候,我们要指定特定的某一个对象去调用 public 中的函数,但是也有一些情况,不可避免的要直接调用类内 public 中的函数,这时候可以使用静态函数的方法。

class Example
{
  static void test()
  {
    //do something ...
  }
};

//在其他函数中

Example::test();
  • 原理:
    static 关键词表示这是类内公用的一个函数/变量(静态函数/变量),它不属于类内的任意一个对象。因此,可以跳过指定对象的环节直接调用。

在类外调用类内的静态变量

类似上面,我们有一个公共的变量 a 。不管定义了多少个对象,它们都公用这一个变量 a ,相应的,变量 a 也只占对应变量类型的空间大小,不会随对象的增多而占用更多的空间。

在类内的函数中,可以直接调用 a

在类外的函数中,可以使用 classname::a 来调用变量 a

class Example
{
  static int a;
  void test1()
  {
    std::cout << a;
  }
};

void test2()
{
  std::cout << Example::a;
}

int Example::a;
// 这一句很重要,下面讲为什么

需要注意的是,在类内写出 static int a; 这样的句子不被视为 “定义” 行为,而是 “声明” 行为。因为 astatic 属性,导致它不属于任意一个对象,所以在开内存的时候,它不能占用任意一个对象的内存,也不能被构造函数初始化。

所以,需要在类外,再次单独给出一次 a 的 “定义”,分配给它一个内存。如果需要的话,也要单独的初始化它。这样才能正常地调用静态变量 a

如果不在类外重新定义 a 的话,编译器会报错 "undefined symbol" 。

在类外强行访问 private 中的元素

尽管这有违面向对象的初衷——保护对象中的元素不能直接从外部访问,但是有时候我们不得不这样做,这就用到了友元关键词 friend

关键词 friend 可以授权其他的类或者函数直接访问该类中的 private 或者protect 中的元素。

class Example
{
  public:
    friend void test1();
  private:
    int a;
}e;

void test1()
{
  std::cout << e.a;
}
//test1() 可以运行,因为 friend 关键词授予了它访问 private 元素的权限

void test2()
{
  std::cout << e.a;
}
//test2() 不能运行,报错显示无权访问 private 中的元素

构造函数需要传参

如果使用构造函数初始化的话,那么大概率需要传参,但是参数又大多都是用户输入的,这就会导致无法把对象定义为全局变量(因为不知道参数,定义的时候会因为构造函数中没有参数而报错)。

一种显而易见的解决方法是不要用构造函数初始化,自己另写一个带 static 关键词类型的初始化函数,然后在主函数中调用。

如果自带反骨,一定要用带参数的构造函数初始化,并且还想开全局变量的话,也有办法:使用 std::vector 。因为 vector 容器的初始长度为 0 ,不占用任何内存,所以声明的时候不会调用构造函数,避免了报错。

在主函数中得到数据之后,可以再把数据打包起来然后用构造函数加 pushback() 函数塞到类里面。

class Example
{
  public:
    Example(const int A[])
    {
      for(int i = 0 ; i < 3 ; i ++)
        a[i] = A[i];
    }
  private:
    int a[3];
};

std::vector < Example > V;

int main()
{
  int a[3];
  for(int i = 0 ; i < 3 ; i ++)
    std::cin >> a[i];
  V.push_back( Example(a) );
  return 0;
}

构造函数的初始化列表

用初始化列表来写构造函数会让代码更整洁!

class Example
{
  public:
    Example(int A, int B) : a(A), b(B){}
  /*
    等价于
    Example(int A, int B)
    {
      a = A;
      b = B;
    }
  */
  private:
    int a, b;
};

另外有个顺序问题,详情可以看这篇 blog

标签:初始化,调用,函数,避雷,笔记,面向对象,int,Example,构造函数
From: https://www.cnblogs.com/zaza-zt/p/17726090.html

相关文章

  • 2023秋季阅读笔记计划
    1、目标阅读的书籍名称《代码大全》、《梦断代码》2、目标阅读笔记的发表时间第一篇:2023-09-24第二篇:2023-09-27第三篇:2023-09-30第四篇:2023-10-03第五篇:2023-10-09第六篇:2023-10-15第七篇:2023-10-21第八篇:2023-10-27第九篇:2023-11-03第十篇:2023-11-08......
  • 《梦断代码》阅读笔记01
    1、与其他的书籍很不同的一点是:这本书有第0章而第0章有这么一句话,也是将我这两年来学习技术的心理状态给描绘了个大概:“helloworld”程序一无所用,但足以蛊惑人心,多少软件雄心勃勃,但最终未结善果。不得不承认的一点是,我当初刚开始使用IDEA编程工具学习Java的时候,坚持学习下去......
  • 学习笔记3
    第十章Sh编程10.1sh脚本:1.sh脚本是一个包含sh语句的文本文件,命令解释程序sh要执行该语句。2.sh脚本与C程序C程序必须先编译链接到一个二进制可执行文件,再通过主sh的子进程运行该二进制可执行文件;sh则可直接执行行命令。sh脚本不需要main函数。10.2sh脚本与C程序两者虽......
  • 2023-2024-1 20211327 信息安全系统设计与实现 学习笔记3(必做)
    学习笔记3程序设计语言必备要素和技能shell脚本实践过程截图程序设计语言必备要素和技能1.语法和语义:了解语言的基本语法规则和语义,包括如何定义变量、数据类型、运算符、控制结构等。这是编写有效代码的基础。2.数据结构和算法:掌握数据结构(如数组、链表、栈、队列)和基......
  • 《信息安全系统设计与实现》第三周学习笔记
    《信息安全系统设计与实现》第三周学习笔记学习程序设计语言的体会必备的要素和技能在Python,c,java语言中我对于c语言的使用最多,所以我主要从c语言的角度说说我对于程序设计语言的必备的要素和技能。在我看来,学习程序设计语言,需要掌握以下必备要素和技能:语法:了解C语言的......
  • 笔记 | 信号和槽机制
    什么是信号和槽?信号和槽是Qt框架中的两个关键元素,用于对象之间的通信。简而言之,信号是对象发出的事件或消息,而槽是用于响应信号的特殊成员函数。通过将信号与槽连接起来,可以在一个对象发出信号时自动调用另一个对象的槽函数。在Qt中,信号和槽是通过宏(Q_OBJECT和SIGNAL、SLOT)进行声明......
  • Qemu源码分析(7)--Apple的学习笔记
    一,前言今天继续分析主要的api,包括了printlog和属性add及set,因为对于不同对象的操作,主要就是靠属性值设置及判断使用。二,源码分析A,关于qemu中自带的-d的log需要传入的参数主要通过-d然后传入的参数如下第2个成员,比如out_asmconstQEMULogItemqemu_log_items[]={{CPU_LOG_TB......
  • 学习笔记3
    第十章:sh编程介绍第十章的主要内容是研究sh编程。对于sh编程的介绍分为以下几个方面:1.sh脚本的编写脚本格式以#!/bin/bash开头(指向解释器)2.sh控制语句2.1脚本格式脚本格式以#!/bin/bash开头(指向解释器)2.2第一个shell脚本,helloworld.sh,输出helloworld!2.3执行方式方......
  • 学习笔记3
    学习笔记3一门程序设计语言具有以下必备的要素和技能:语法:了解语言的基本语法规则,包括变量、数据类型、运算符、控制流程(如条件语句和循环语句)、函数定义等。数据结构:理解常见的数据结构,如数组、链表、栈、队列、树、图等,并能够灵活地应用于实际问题中。算法:掌握常见的算法思......
  • 信息安全系统设计与实现课程第十章学习笔记
    一、知识点总结1、sh脚本sh脚本是一种文本文件,包含一系列sh语句,用于执行一系列命令。它是一种脚本语言,通常以.sh为文件扩展名。脚本的执行需要使用shell解释器,比如Bash、csh、ksh等。脚本的基本结构如下:#!/bin/bash#Thisisacommentecho"Hello,World!"在这个示例中,#!/......