C++类复习及新的认识 6.1.1+6.1.2内容(适合看过一遍书的新手)
作者水平有限,文字表述大多摘抄课本,源码部分由课本加自己改编而成,所有代码均在vs2019中编译通过
定义类操作
class Tdate { public: void Set(int m, int d, int y ) { month = m ; day = d ; year = y ; } int IsLeapYear() { return ( year%4 == 0 && year%100 != 0 )||( year%400 == 0); } void Print() { cout << year << "." << month << "." << day << endl ; } private: int month;
int day;
int year; };
上面是一个时间类的定义,可以看到类中是有成员和成员函数的,成员函数可以在类里面定义也可以在类外定义
在类中定义的成员函数是当作内联函数来处理的,关于内联函数的学习链接:
在类外定义的成员函数当成普通函数处理
上面是从书上的例子,当然,按照好的编程习惯我们应该这么定义,在类里面声明,在类外定义,这样在可以不暴露实现代码的情况下提供外部接口
#ifndef Tdate_H
#define Tdate_H
//Tdate.h
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
class Tdate
{
public:
void Set(int m, int d, int y ) ;
int IsLeapYear();
void Print();
private:
int month;
int day;
int year;
};
#endif
//Tdate.cpp #include "Tdate.h" void Tdate::Set(int m, int d, int y) { month = m; day = d; year = y; } int Tdate::IsLeapYear() { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); } void Tdate::Print() { cout << year << "." << month << "." << day << endl; }
最后我们在主函数中实现
//main.cpp #include <iostream> #include "Tdate.h" int main() { Tdate a; a.Set(10, 16, 2003); a.Print(); }
F5编译结果
成员的性质由关键字public、protected、private 决定
public 公有 公有段的成员是提供给外部的接口
protected 保护 保护段成员在该类和它的派生类中可见
private 私有 私有段成员仅在类中可见
各段中既可以包含数据成员,也可以包含成员函数
最好还是把数据放到private,成员函数接口放到public
类中定义的一些情况
比如说,类中可以定义一个指向这种类的指针
//例: class link {
link * next ;
// …… };
也可以在第二个类中定义第一个类的数据类型
class X { //…… }; class Y { X dataMember ; //…… };
但是下面一种情况是要避免的
class X { //X dataMember ;这种情况是错误的,会产生无限递归 // …… };
那么,为什么X类中可以有指向X类的指针,不能有X类的数据成员呢?
因为指针的大小是确定的!指针的大小实际上是由CPU的寻址位数决定,而不是字长。在32位cpu中指针的大小位4b,64位cpu中指针的大小为8B(从指针的意义出发,指针中存放的是目标数据的地址,在32位cpu中寻址宽度是32,64位中寻址宽度就是64)(参考https://blog.csdn.net/lhj_168/article/details/80308041)
类也可以定义无名和空类,一般不推荐,就不写了
其中,空类在编译的时候编译器会自动给它加上一个字节
class empty {}; class test { int a; char b; };
cout<<sizeof(empty);//编译器编译的时候会将每个类实例化 cout << endl; cout << sizeof(test);
结果运行是1和8,这是因为空类编译器自动添加一个标识符,占一个字节(当里面有东西的时候这个标识符就不加了),至于8的原因,就是C++编译器会对地址进行对齐(内存大小参考:https://blog.csdn.net/qinghezhen/article/details/9100079)(对齐参考:https://my.oschina.net/u/185531/blog/2222034)至于对齐这个是编译器的原因了,作者暂时没有学编译原理,不敢妄下结论,有兴趣的读者可以自行查询
在类外使用成员或成员函数使用“ . ”和“ -> ”(指针使用的是后者)
6.1.3将会介绍this指针,由于this指针比较重要,单独开一贴讲
posted on 2020-03-24 14:49 Kevin_Weng 阅读(181) 评论(0) 编辑 收藏 举报