在输入课本例子验证过程中,总是会发现一些值得思考的问题,如在以下代码中的类定义过程中,函数后面跟上一个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;
}
疑问:
- 可以看到类的成员函数有的带return,有的不写?
其实也没什么大碍,和C是一样程序执行完了也会返回调用函数。 - 类使用及类间调用问题??与c有什么不同呢?
c中函数的调用是通过头文件包含或extern关键字声明,这样外部的其他C文件就可以通过文件名来访问函数或变量。
C++则是通过类实例化后,来访问里面的函数或变量,并且对于私有变量,只能是通过相关类本身的函数来访问。
仅凭此点,说明不了C++或类的优势,只能说进一步的抽象,更符合人的思维,后面的类继承、反射等,才进一步突出面向对象思维的先进的地方!从这点来说,C++是C的进一步抽象就不为过了。 - 函数后面跟个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++复习之概述、特点已经复习过了,只是再总结加深一下。