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

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

3: 类的定义示例


//定义一个日期类myDate
class myDate
{
public:
  myDate();//构造函数 
  myDate(int,int,int);//构造函数 
  void setDate(int,int,int);//设置日期 
  void setDate(myDate);//设置日期 
  myDate getDate();//获取日期 
  void setYear(int);//设置年 
  int getMonth();//获取月 
  void printDate() const;//打印日期  成员函数printDate()需要使用const进行限定
private:
  int year,month,day;//成员变量,表示年,月,日 
};  


//在类体外定义成员函数
  myDate::myDate()
  { year=2022,month=1,day=1;
  }//构造函数
  myDate::myDate(int y,int m,int d)
  { year=y;month=m;day=d;
  }//构造函数
  void myDate::setDate(int y,int m,int d)
  { year=y;month=m;day=d;
    return;
  }//设置日期
  void myDate::setDate(myDate oneD)
  { year=oneD.year;month=oneD.month;day=oneD.day;
   return;
  }//设置日期
  myDate myDate::getDate()
  { return*this;
  }//获取日期;*this是自身对象
  void myDate::setYear(int y)
  { year=y;
    return;
  }//设置年
  int myDate::getMonth()
  { return month;
  }//设置月
  void myDate::printDate()const
  {  cout<<year<<"/"<<month<<"/"<<day;
   return;
  }//打印日期


在myDate 类中定义了分别表示年、月、日的三个私有成员变量来访问year、month、day,并且定义了公有的访问成员函数,可用于访问这些成员变量。


setDate()是重载函数,使用不同类型的量设置一个日期。getDate()用于获取函数。通常设置函数以set 为函数名前缀,获取函数以 get 为函数名前缀。

在C++语言中,当调用一个成员函数时,系统自动向它传递一个隐含的参数,这个参数是一个指向调用该函数的对象的指针,叫做 this 指针,从而使成员函数知道对哪个对象进行操作。在程序中,可以使用关键字 this 来引用该指针。例如:如果在A类中有成员变量 date 和成员函数 getDate(),通过类A的对象a 调用函数 getDate(),那么编译系统就会把对象a 的地址赋值给函数getDate()中的this 指针,this 指针访问到的成员变量 date 就是属于对象a 的成员变量,也就是 this->date 就相当与a.date。


//定义一个学生类Student
class Student
{
public:
    void setStudent(string,myDate);//设置学生信息
    void setName(string);//设置姓名
    string getName();//获取姓名
    void setBirthday(myDate);//设置生日
    myDate getBirthday();//获取生日
        void printStudent() const;//打印信息 
private:
    string name;
    myDate birthday;
};


//在类体外定义成员函数
  void Student::setStudent(string s,myDate d)
  {  name=s;
     birthday.setDate(d);
     return;
   }
   void Student::setName(string n)
   {   name=n;
     return;
   }
   string Student::getName()
   {   return name;
   }
   void Student::setBirthday(myDate d)
   {  birthday.setDate(d);
      return;
    }
    myDate Student::getBirthday()
    {  return birthday;
    }
   void Student::printStudent() const
   {  cout<<"姓名"<<name<<"/"<<"\t 生日";
    birthday.printDate();//调用类myDate 的成员函数
    cout<<endl; 
   }


定义类时,类的成员变量的类型不仅可以是系统内置的基本数据类型,还可以是类类型:定义学生类Student ,它包含姓名,生日,专业等属性,姓名可以用系统定义好的类string来表示生日可以用 定义好的类myDate 来表示。


26378ad537094c8f9325c5e25bf97c7a.png


四:访问对象的成员


1:使用对象访问成员变量与调用成员函数


定义了类和对象后就可以访问对象的成员。通过对象访问成员变量的一般格式:


对象名.成员变量名


调用成员函数的一般格式:


对象名.成员函数名(参数表)


程序举例


验证Student 类功能的驱动程序


#include <iostream>
#include <string> 
#include "myDate.h"
#include "Student.h"
using namespace std; 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char** argv) {
  Student ss;
  int y,m,d;
  string name_;
  cout<<"请输入学生的姓名和生日" <<endl;
  cin>>name_>>y>>m>>d;
  ss.setStudent(name_,myDate(y,m,d));//创建Student的对象 ss,这里要考虑到成员名的访问范围,需要通过类Student 提供的公有访问方法即setStudent()才能将键盘读入的字符串赋值给对象ss。
  ss.printStudent();
  return 0;
}


输出结果:

c1fbf401237242d194170e5409f8ef05.png


2:使用指针访问对象的成员


我们将程序主函数修改一下:


int main()
{   Student ss;
    int y,m,d;
    string name_;
    Student *st=&ss;//指针st,指向ss,并使用&ss给指针赋初值
    cout<<"请输入学生的姓名和生日";
    cin>>name_>>y>>m>>d;
    st->setStudent(name_,myDate(y,m,d));//指针操作符  指针名->成员名
    st->printStudent();
    return 0;
}


3:使用引用访问对象的成员


int main()
{
  Student ss;
  int y,m,d;
  string name_;
  Student &sn=ss;//ss的别名sn,sn和ss成为同一个对象的不同名字
  cout<<"请输入学生的姓名和生日";
  cin>>name_>>y>>m>>d;
  sn.setStudent(name_,myDate(y,m,d));//访问成员时采用点操作符 引用名.成员名
  sn.printStudent();
  return 0;

27edbfa1c97f4ba8b7ac970a6d6ab90e.png


五:标识符的作用域与可见性


每个标识符都有各自的作用域(指的是标识符的有效范围,也就是它在程序中的存在区域)和可见性(是指在程序中的哪个区域里可以使用),对于同一个标识符来说,这两个区域可能是不完全重合的。类名、函数名、变量名等都是标识符。

c++中的标识符的作用域有函数原型作用域、局部作用域(块作用域)、类作用域和命名空间作用域。


1:函数原型作用域


在声明函数时原型时形参的作用范围就是函数原型作用域,这是c++程序中最小的作用域,生命周期最短:


double area(double d)

d为参数,作用域是原型作用域,即标识符d的作用范围在函数 area 形参列表的左右括号之间,在程序的其他地方不能应用这个标识符。


函数原型作用域的作用范围就在括号中


2:局部作用域


程序中使用相匹配的一对大括号括起来的一段程序叫做块。作用域局限在块内的叫做局部作用域:

0272d86560544c8aa6b41175840c26ce.png

3:类作用域


类可以被看作是一组有名字的成员的集合,类X的成员m具有类作用域,对m的访问方式有:

如果在类X 的成员函数中没有声明同名的局部作用域标识符,就可以在该函数内直接访问成员m;

在类外,可以通过表达式x.m或X::m进行访问;还可以通过ptr->来访问,其中ptr是指向类X的一个对象的指针


4:命名空间作用域


命名空间是为了消除同名引起的歧义,具有命名空间作用域的变量也叫做全局变量。定义命名空间的一般格式:


namespace 命名空间名
{
  命名空间内的各种声明(函数声明等)
}


c++标准库中所有的标识符都定义在一个名为std 的命名空间中,因此在程序的示例部分中都出现了:using namespace std;


3808e1904afd4a76b059222613529099.png


总结


当我们在实施自己的计划,追求自己的理想时,如果能够坚持下去,再坚持下去,或许我们在年老甚或离开人世的时候,会少一些遗憾。

相关文章
|
2月前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
49 0
|
3月前
|
存储 编译器 C++
|
3月前
|
存储 安全 编译器
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
|
3月前
|
人工智能 分布式计算 Java
【C++入门 一 】学习C++背景、开启C++奇妙之旅
【C++入门 一 】学习C++背景、开启C++奇妙之旅
|
3月前
|
存储 自然语言处理 编译器
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
|
3月前
|
小程序 C++
【C++入门 二 】学习使用C++命名空间及其展开
【C++入门 二 】学习使用C++命名空间及其展开
|
3月前
|
存储 C++ 索引
|
3月前
|
存储 C++ 容器
|
3月前
|
算法 数据处理 C++

相关实验场景

更多
下一篇
无影云桌面