C++学习——坚持(二)(1)

简介: C++学习——坚持(二)

前言


努力不一定成功,但是坚持做好一件事一定很酷。


在上一篇文章 C++学习——共勉(一) 中学习了C++语言的特点和程序结构,这篇文章就简单看看面向对象的基本概念。


6bce345c79124f46a36b8272655589a9.png


一:结构化程序设计


在面向对象程序设计方法出现之前,软件界流行的主流设计方法之一就是结构化程序设计方法,也称为面向对象的设计方法。


在机构化程序设计中,采用自顶向下、逐步求精以及模块化思想,有个著名的公式体现了这一思想:数据结构+算法=程序。可以说,程序基本上都含有顺序、选择、循环3种基本控制结构。


一个完整的c++程序包括以下几个部分:

一个主函数,可以用来调用其他函数,也叫做主程序(关于主函数是否能被调用,我在网上也查了一些资料并实验了一下:如果不加约束条件去调用主函数的话就会死循环,这时候考虑用递归的思想去调用就能运行出来。但是一般情况下不会对主函数进行调用,个人觉得c++中主函数能否被调用应该还未定义,期待前辈们指点!)

自主定义的任意多个类和全局函数

全局说明,在所有函数和类定义之外的变量说明和函数原型

必要注释

头文件


对于比较大的文件,可以根据主函数和所定义的各个类以及全局函数的功能和相互关系,可以将类和全局函数划分为几个程序文件,包括 cpp. 文件(源程序文件)和 .h 文件(头文件)。


1:面向对象的程序设计


对象就是数据+函数,也就是属性+操作。举个简单的例子:员工的姓名、职位、工资等就是一个个变量;员工进行加班、出差、摸鱼划水,或者获得提拔、炒鱿鱼等就是操作;而操作会施加于属性,比如“加班、出差、摸鱼划水”操作会修改“工资”属性;“提拔、炒鱿鱼“操作会修改”职位“属性。

用对象名标识一个个对象,用数据表示对象的属性,再用函数实现操作。

C++中使用对象名、属性、操作三要素来描述对象。


2:类模型结构


类模型结构和对象结构很相似,它们都含有属性和操作,唯一不同的是对象结构图中有对象名而没有类名;类模型结构图中有类名但没有对象名。

ffba5e944c83484a92cf5b86ebeb32dd.png3c25730d51a143a4ae8efdb56fd04aac.png


二:创建类对象的基本形式


定义一个普通对象,即类变量的基本方法有两种:


方法一


类名 对象名;

类名 对象名(参数);

类名 对象名 = 类名(参数);

可以扩展为对个对象:

类名 对象名1,对象名2,....;

或者

类名 对象名 1(参数1),对象名2(参数2),...;


方法二


类名 *对象指针名 =new 类名; //使用该方法调用函数时,调用无参的构造函数,如果这个构造函数是由编译器为类提供的,那么类中成员变量不进行初始化。

或者

类名 *对象指针名 =new 类名(); //在创建对象时调用无参的构造函数。如果这个构造函数时由编辑器为类提供的,那么对类中的成员变量进行初始化。

或者

类名 *对象名指针 =new 类名(参数);

使用new创建对象时返回的是一个对象指针,这个指针指向本类刚创建的这个对象。使用new 创建的对象,必须用delete撤销。


声明对象引用(变量别名)格式:

类名 &对象引用名=对象;


声明对象指针格式:

类名 *对象指针名=对象的地址;


声明对象数组格式:

类名 对象数组名[数组大小];


例如,我们定义了一个类 A:


A b1,c1;//定义A类的对象b1和c1
A *p=&b1;//定义一个类型为A类的指针,指向对象b1
A &Q=c1;//定义A类类型对象C1的引用Q
A B[3];//定义A类类型对象的数组B,含有3个元素

6ff70e9663da4554860e8d0c62cccba4.png


三:类的初步知识


1:类的定义


面向对象方法中的类,是对具有相同属性中的同一类对象的抽象描述,其内部包括属性(本类的成员变量)和行为(本类的成员函数)两个主要部分,也就是类以数据为中心把相关的函数组成为一体。

在C++中,类定义的一般格式:


   class 类名
   {
   访问范围说明符:
   成员变量 1
   成员变量 2
   ...
   成员函数声明 1
   成员函数声明 2
   ...
   访问范围说明符:
   更多成员变量
   更多成员函数变量
   }


类以关键字 class 开始,后面是类名。类名的定义遵循一般的标识符命名规则,也就是字母、数字、下划线的组合并且对大小写敏感,但不能使用数字开头,也不能和系统中使用的关键字完全相同。

类是具有唯一标识符的实体,就是说类名不能完全 重复,类的定义以“ ;” 结束,大括号中的部分叫做类体。


“成员变量”是类中的一类成员,代表对象的属性,个数不限,也称为数据成员。成员变量的声明方式和普通变量的声明方式相同。“成员函数“是类中的另一类成员,代表对该类对象所含数据操作的方法,个数不限,其声明方式和普通函数的相同。

成员变量和成员函数的出现次序没有限制,一个类的成员函数之可以相互调用,类中可以不含有任何成员变量和成员函数,这样的类叫做“空类”。

成员函数既可以在类体内定义,也可以在类体外定义。如果成员函数定义在类体内部,则默认是内联函数

如果成员函数定义在类体外,则类体内必须要有函数原型,类体外函数定义的前面要有限定,格式为:


返回值类型 类名::成员函数名(参数列表)

{

成员函数的函数体

}

类名是成员函数所属类的名字, 符号 :: 是类作用域的运算符,表明它后面的成员函数是属于类名标识的这个类的。返回值类型就是这个成员函数返回值的类型。


2:类成员的可访问范围


访问范围说明符一共有三种 public(公有),private(私有),protect(保护),在类的定义中可以以任意的次序出现多次。


public 使用它修饰的类成员可以在程序任何地方被访问
private 使用它修饰的类成员仅能在本类中被访问
protect 使用它修饰的类成员能在本类内和子类中被访问



成员的可访问范围由它之前离得最近的访问范围说明符决定,如果某个成员前面没有访问范围说明符,那么对于类来说,该成员默认为私有成员。


  class A
  {
    int m,n;
  public:
    int a,b;//公有成员变量
    int func1();//公有成员函数
  private:
    int c,d;//私有成员变量
    void func2();//私有成员函数
  public:
    char e;//公有成员变量
    int f;//公有成员变量
    int func3();//公有成员函数
  }


类成员访问示例


#include <iostream>
#include <string>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
class Staff
{
  private://私有成员
    string name;
    int salary;
  public://公有成员
    void setName(string);
    string getName();
    void setSalary(int);
    int getSalary();
    int averageSalary(Staff);
};
  void Staff::setName(string myname)
  {
    name=myname;
  }
  string Staff::getName()
  {
    return name;
  }
  void Staff::setSalary(int mysalary)
  {
    salary=mysalary; 
  }
  int Staff::getSalary()
  {
    return salary;
  }
  int Staff::averageSalary(Staff s1)
  {
    return (salary+s1.getSalary())/2;
  }
int main(int argc, char** argv) {
  Staff sL,sS;
  sL.setName("Linda");//name 是私有变量,不能直接访问,需要通过公有成员setName来访问
  sL.setSalary(12345);//salary 也是私有变量,需要借助公有成员 setSalary来访问
  cout<<"第一个员工的姓名和薪水是:"<<sL.getName()<<","<<sL.getSalary()<<endl;
  sS.setName("Susan");
  sS.setSalary(54321);
  cout<<"第二个员工的姓名和薪水是:"<<sS.getName()<<","<<sS.getSalary()<<endl;
  cout<<"两个员工的平均薪水是:"<<sL.averageSalary(sS)<<endl; 
  return 0;
}


输出结果:

448aafd81546419f97399321072c0d8d.png


相关文章
|
4月前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
82 0
|
2月前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
|
2月前
|
Java 编译器 C++
c++学习,和友元函数
本文讨论了C++中的友元函数、继承规则、运算符重载以及内存管理的重要性,并提到了指针在C++中的强大功能和使用时需要注意的问题。
23 1
|
5月前
|
存储 安全 编译器
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
|
5月前
|
人工智能 分布式计算 Java
【C++入门 一 】学习C++背景、开启C++奇妙之旅
【C++入门 一 】学习C++背景、开启C++奇妙之旅
|
5月前
|
存储 自然语言处理 编译器
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
|
5月前
|
小程序 C++
【C++入门 二 】学习使用C++命名空间及其展开
【C++入门 二 】学习使用C++命名空间及其展开
|
5月前
|
存储 C++ 索引
|
5月前
|
存储 C++ 容器
|
5月前
|
算法 数据处理 C++