[CPP]大一学生学习C++的笔记(1)

[CPP]C++学习之路——构造函数、多个文件包含与连接


心路历程

今天在课上听老师讲到可以将类的定义放入头文件,将类的函数成员的定义放入一个cpp文件,再在一个main.cpp文件中将它们包含进来。
室友和我回宿舍后尝试对课上的示例代码进行复现,然后遇到了一些问题,在一番百度之后算是解决了,还遇到了几个书上和课上没讲到的知识点,所以想到写一篇博客来记录下来。


室友遇到的问题
//clock.h
class Clock {
    
    
	private:
		int hour, minute, second;
	public:
		void settime(int h, int m, int s);
		void showtime();
		Clock(int H, int M, int S);//构造函数
		Clock();//默认构造函数
		Clock(Clock &cc);//复制构造函数
};

clock.h中存放的是对类的定义和类的函数成员的声明。

//clock.cpp
#include <iostream>
#include "clock.h"
using namespace std;

void Clock::settime(int h, int m, int s) {
    
    
	hour = h;
	minute = m;
	second = s;
}

void Clock::showtime() {
    
    
	cout << hour << ":" << minute << ":" << second << endl;
}

Clock::Clock(int H, int M, int S) {
    
    
	hour = H;
	minute = M;
	second = S;
	cout << "构造函数被调用..." << endl;
}

Clock::Clock() {
    
    
	hour = 0;
	minute = 0;
	second = 0;
	cout << "默认构造函数被调用..." << endl;
	//调用时无须提供参数的构造函数称为默认构造函数
}

Clock::Clock(Clock &cc) {
    
    //利用了对象的引用
	hour = cc.hour;
	minute = cc.minute;
	second = cc.second;
	cout << "复制构造函数被调用..." << endl;
}

clock.cpp中存放的是对类的函数成员的定义。

//main.cpp
#include "clock.h"

int main() {
    
    
	Clock c1;
	Clock c2(12, 12, 12);//调用构造函数对c2进行初始化
	c1.showtime();
	c2.showtime();
	Clock c3(c2);
	c3.showtime();
	return 0;
}

老师操作时使用的是命令行的link命令将三个文件的obj连接到一起,而室友使用Dev-C++对单个文件进行编译时报出错误信息:未定义的引用;找不到头文件等等。
一番百度后,找到的解决办法如下。
解决办法
点击左上角文件-新建-项目来新建一个项目,然后对项目右键,点击添加,将这三个文件添加到同一个项目中。
按住CTRL+左键选中这三个文件,按F9编译,编译通过,按F10运行,运行成功,得到结果如下。
运行结果


我遇到的问题

看到室友解决了问题,我也心血来潮,决定自己敲一遍。
我的代码绝大部分与上述代码相同,但在main.cpp中多了一行#include “clock.cpp”

//我的main.cpp
#include "clock.h"
#include "clock.cpp"

int main() {
    
    
	Clock c1;
	Clock c2(12, 12, 12);//调用构造函数对c2进行初始化
	c1.showtime();
	c2.showtime();
	Clock c3(c2);
	c3.showtime();
	return 0;
}

按上述方法编译时出现

[错误] 重复定义: 'class Clock'

这让我百思不得其解。
一番百度后,在CSDN的两篇博客上看到了报错的原因。
注意头文件规则,避免链接错误:重复定义(multiple defination)

#pragma once用法总结

看来是在编译预处理时重复引用造成了二义性。
我将#include "clock.cpp"这条语句注释掉,再次编译,通过,然后运行,这次成功了。

猜你喜欢

转载自blog.csdn.net/maets906/article/details/114993775