c++考点之类使用

这篇博客探讨了C++中的类和成员函数,特别是const成员函数的作用。const成员函数表示该函数不会修改数据成员,只能调用其他const函数。此外,还讲解了const修饰类对象的限制,以及const用于初始化静态成员变量的情况。通过示例代码,阐述了const在实际编程中的应用和限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在输入课本例子验证过程中,总是会发现一些值得思考的问题,如在以下代码中的类定义过程中,函数后面跟上一个const是什么意思呢?如何定义类中的函数?何时需要借助类中的函数实现,何时不用呢?

#include <iostream>
#include <string>
using namespace std;

class myDate {
   public:
    myDate();               //构造函数
    myDate(int, int, int);  //构造函数
    void setDate(myDate);//把整个类对象传进去
    myDate getDate();
    void setYear(int);
    int getMonth();
    void printDate() const;  //这里的const是什么意思呢?
   private:
    int year, month, day;
};
myDate::myDate() {
    year = 1985;
    month = 1;
    day = 1;
}
myDate::myDate(int y, int m, int d) {
    year = y;
    month = m;
    day = d;
}
void myDate::setDate(myDate oneS) {
    year = oneS.year;
    month = oneS.month;
    day = oneS.day;
}
myDate myDate::getDate() { return *this; }
void myDate::setYear(int y) {
    year = y;
    return;
}
int myDate::getMonth() { return month; }
void myDate::printDate() const {
    cout << year << "/" << month << "/" << day;
    return;
}
class Student {
   private:
    /* data */
    string name;
    myDate birthday;//声明一个类对象

   public:
    Student(/* args */);
    ~Student();
    void setStudents(string, myDate);
    void setName(string);
    string getName();
    void setBirthday(myDate);
    myDate getBirthday();
    void printStudent() const;
};

Student::Student(/* args */) {}

Student::~Student() {}
void Student::setStudents(string s, myDate d) {
    name = s;
    birthday.setDate(d);//由于year等是私有变量不能直接访问,所以得通过其函数赋值
}
void Student::setName(string s) {
    name = s;
    return;
}
string Student::getName() { return name; }
void Student::setBirthday(myDate onet) {
    birthday.setDate(onet);
    return;
}
myDate Student::getBirthday() { return birthday; }
void Student::printStudent() const {
    cout << "name:\t" << name << " birthday:\t";
    birthday.printDate();
    cout << endl;
}
int main(int argc, char const *argv[]) {
    /* code */
    Student ss;
    int y, m, d;
    string name;
    cout << "please input the sutdent name and birthday:";
    cin >> name >> y >> m >> d;
    ss.setStudents(name, myDate(y, m, d));
    ss.printStudent();
    return 0;
}


疑问:

  1. 可以看到类的成员函数有的带return,有的不写?
    其实也没什么大碍,和C是一样程序执行完了也会返回调用函数。
  2. 类使用及类间调用问题??与c有什么不同呢?
    c中函数的调用是通过头文件包含或extern关键字声明,这样外部的其他C文件就可以通过文件名来访问函数或变量。
    C++则是通过类实例化后,来访问里面的函数或变量,并且对于私有变量,只能是通过相关类本身的函数来访问。
    仅凭此点,说明不了C++或类的优势,只能说进一步的抽象,更符合人的思维,后面的类继承、反射等,才进一步突出面向对象思维的先进的地方!从这点来说,C++是C的进一步抽象就不为过了
  3. 函数后面跟个const,是什么意思呢?
    这种形式,没遇到过有些新鲜。还有一点要说明的是,刚开始看这个程序时,也是头大,一上来就100行,没想到读了两三遍,将疑问逐一查找解决后,反而觉得这个程序简单了。“不能放弃选择的自由和能力,哪怕再看不懂,多看几遍后,一定会懂的.”
    转入正题:函数后面跟const,这里还应发现,这个函数是成员函数,所以,就有了专业的名词:const成员函数或const函数代表:不会修改数据成员的函数,且不能调用非const函数.如上述例程中void Student::printStudent() const ,就只调用了void printDate() const; 这一个const函数。
扩展:关于类const其他用法

1). const修饰类对象:

#include <iostream>
#include <string>
using namespace std;

class test {
   private:
    const int x;int y;
   public:
    test() : x(100) { y = 2; }
    ~test() {}
    void set(int yy) { y = yy; }
    int getx() const { return x; }
};
int main(int argc, char const *argv[])
{
    /* code */
    const test su;
    int a;
    su.set(12);
    a = su.getx();
    cout << "the a:\t" << a << endl;
    return 0;
}

执行主函数第3行:su.set(12)会报错,如下图所示:报错信息
这个其实在写程序时,IDE已经明确提示了,如下图:编写程序时的提示
结论:被const修饰后的类const test su;只能调用const成员函数。
实际编程场景:现实中估计没人会把类用const修饰。
2). 类声明中使用const初始化static修饰的变量

#include <iostream>
#include <string>
using namespace std;
class test {
   public:
    test(int x_val = 23, int y_val = 13);
    const int b = 6;
    static const int c = 7;
 //   static int d = 8;  // error
    static int d;
    ~test();

   private:
    int x;
    int y;
};
int test::d = 8;  //放在类定义之后
test::test(int x_val, int y_val) : x(x_val), y(y_val) { cout << "x:\t" << x << " y:\t" << y << endl; }

test::~test() {}
int main(int argc, char const *argv[]) {
    test aa;
 //   aa.test(23, 12);
    return 0;
}

实际编程场景:这个应该来说还是有用的,因为在类声明中直接赋值static对象,会报错,但加const后,可以赋值了。

const修饰变量时,一般是从右往左读,如:int* const ptr2=arr[3] ;//ptr2是一个const指针,指向int类型,表示指针指向不能被改变,但是指向的变量内容可以被改变。这些在c++复习之概述、特点已经复习过了,只是再总结加深一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guangod

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值