从java到C++ 面向对象(一)

一、从一个Person类开始


public class Person 
{
	private int age;
	private char sex;
	private String name;

	public Person(){}

	public Person(String name)
	{
		this.setName(name);
	}

	public void setName(String name)
	{
		this.name = name;
	}

	public String getName()
	{
		return this.name;
	}

	public void setAge(int age)
	{
		this.age = age;
	}

	public int getAge()
	{
		return this.age;
	}
}


我们建立了一个传统的javabean。现在我们要思考这样一个javabean在C++中是如何存在的呢。

C++由于是由C语言过渡过来的所以他保留了C语言的特性。并增加了许多新内容。

C语言经常能够看到#include<stdio.h>这样一句话。表示导入了stdio.h这个文件。就相当于java中默认的 import  java.lang.* 这个包一样。

而C++中你可以把这个.h文件看做是一个类。这个文件里我们做出所有函数的声明。

然后我们建立一个同名的 .cpp文件导入这个.h文件并实现里面的函数就可以了。


下面我们写一个Person.h文件

#pragma once
class Person
{
public:
	Person(void);
	Person(const char *name);
	void setAge(const int age);
	int getAge(void) const;
	void setName(const char* name);
	const char* getName(void) const;
private:
	int age;
	char sex;
	char *name;
};


可以看到我们这里仿照java定义了一堆共有方法和三个私有成员函数。

我还很"聪明得"用了#pragma once防止重复编译

还用了几个const防止值被修改

然后我们再写一个Person.cpp文件

#include "Person.h"
#include "string.h"

Person::Person(void)
{
}

Person::Person(const char *name)
{
	this->setName(name);
}

void Person::setAge(const int age)
{
	this->age = age;
}

//后面加 const 表示常成员函数。表示函数内不能改变成员变量的值
int Person::getAge(void) const 
{
	return this->age;
}

void Person::setName(const char* name)
{
	int len = strlen(name);
	this->name = new char[len+1];    //空间多开辟一点。安全些
	strcpy(this->name,name);
}

//由const修饰表示不能改变常量成员name。 返回值为 const char*指针表示不能修改内容
const char* Person::getName(void) const 
{
	return this->name;
}


这已经和我们的java代码很像了是不是?当然这还不够完全还要继续改进。

这里我直接将最终版贴出来

Person.h

#pragma once
class Person
{
public:
	Person(void);
	Person(const char *name);
	Person(const Person &person);
	Person &operator=(const Person &person);
	~Person(void);
	void setAge(const int age);
	int getAge(void) const;
	void setName(const char* name);
	const char* getName(void) const;
private:
	int age;
	char sex;
	char *name;
};


Person.cpp

#include "Person.h"
#include "string.h"
#include "iostream"

//宏定义安全释放name语句;
#define SAFE_DELETE_ARRAY(p) do { if(p) { delete[] (p); (p) = 0; } } while(0);
#define SAFE_DELETE(p) do { if(p) { delete (p); (p) = 0; } } while(0);

/*
*1)构造函数使用 :var(value),var(value)...的形式初始化.
*2)构造函数之间调用使用 new (this) Person(param...);互相调用。一般写个私有方法比较好
*3)C++中new 与 delete是相互对应的。new出来的是在堆中C++不会回收。必须使用delete。而在栈中的变量则函数结束后会自动出栈。
*4)对于字符串一般说要开的长度是 len+1 要为''留空间。防止delete报
*	CRT detected that the application wrote to memory after end of heap buffer
*/
Person::Person(void):name(0)
{
}

Person::Person(const char *name):name(0)
{
	this->setName(name);
}

Person::Person(const Person &person):name(0)
{
	this->setName(person.name);
	this->age=person.age;
	this->sex=person.sex;
}
Person &Person::operator=(const Person &person)
{
	this->setName(person.name);
	this->age=person.age;
	this->sex=person.sex;
	return *this;
}

Person::~Person(void)
{
	printf("%s
",this->name);
	SAFE_DELETE_ARRAY(this->name);
}

void Person::setAge(const int age)
{
	this->age = age;
}

//后面加 const 表示常成员函数。表示函数内不能改变成员变量的值
int Person::getAge(void) const 
{
	return this->age;
}

void Person::setName(const char* name)
{
	SAFE_DELETE_ARRAY(this->name);
	int len = strlen(name);
	this->name = new char[len+1];  //对于开动态开辟空间+1防止报错
	strcpy(this->name,name);
}

//由const修饰表示不能改变常量成员name。 返回值为 const char*指针表示不能修改内容
const char* Person::getName(void) const 
{
	return this->name;
}



原文地址:https://www.cnblogs.com/leejuen/p/5547457.html