只编译一次头文件
一个.h文件只能被编译一次,如果你在多个文件中包含,那就会被编译多次,从而程序出错,那么在C中,你可以这样来控制只包含一次
#ifndef _PROGRAME
#define _PORGRAME
//这里写定义的内容
typedef struct Node{
int data;
struct Node * next;
}Node;
#endif
通过如上方法,不过你引入这个头文件几次,编译器都只会编译一次,而在C++中只需要引入一个指令就能达到同样的效果
#pragram once
typedef struct Node{
int data;
struct Node * next;
}Node;
将类的实现和类的成员属性分离
在C++中同通常不会把类的实现和类的属性放到一起,而是分开实现,如果将函数和属性放到一起,编译器自动把函数转换成内联函数,之前的helloword中,介绍了如下的实现方式
class Teacher{
private:
int age;
char name[0];
public:
void sayHello(){
cout<<"hello"<<endl;
}
};
但是在实际开放中,往往会把类中的方法和类的成员属性分离,那么就有如下实现方法,你先需要建立两个文件Teacher.h、Teacher.cpp
//Teacher.h
#pragam once//避免多次编译,可以使用#ifndef #define #endif
class Teacher{
private:
int age;
char name[32];
public:
void setAge(int age);
int getAge();
};
//Teacher.cpp
include "Teacher.h"
void Teacher::setAge(int age){
this->age = age;
}
int Teacher::getAge(){
return this->age;
}
//main函数中使用
#include "Teacher.h"
int main(){
Teacher t;
t.setAge(36);
cout<<t.getAge()<<endl;
}
面向对象初步案例
我们如果想判断一个点是否在圆内,如果使用面向对象的观点看待问题,那么我们可以将圆看成一个对象,将点看成一个对象
//Circle.h
#pragam once
#define pi 3.14
class Circle{
private:
int r;
int s;
public:
void setR(int r);
int getR(){
return this->r;
}
int getS();
bool isContainPoint(Point &point);
};
//Circle.cpp
#include "Circle.h"
void Circle::setR(int r){
this->r = r;
}
int Circle::getR(){
return this->r;
}
int Circle::getS(){
return pi * (this->r) * (this->r);
}
bool Circle::isContainPoint(Point &point){
if(point.a * point.a + point.b * point.b < (this->r) * (this->r)){
return true;
}else{
return false;
}
}
//Point.h
class Point{
private:
int a;
int b;
public:
void setA(int a);
void setB(int a);
}
//Point.h
void Point::setA(int a){
this->a = a;
}
void Point::setB(int a){
this->b = b;
}
//Main.cpp
#include "iostream"
#include "Circle.h"
#include "point.h"
using namespace std;
int main(){
Circle c;
c1.setR(2);
Point p;
p.setA(1);
p.setB(1);
if(c.isContainPoint(p)){
cout<<"这个点包含在c中"<<endl;
}
}