第一篇:
https://www.jianshu.com/p/667b7160b3f9
序言
上篇我们熟悉了C++的基本用法,既然C++也是一门面向对象的语言,那么这期我们就来对比下Java和C++中,方法和类是如何书写的。
方法
Java
public void hello() {
System.out.print("Hello, World!");
}
C++
int hello(); // C++ 函数声明阶段
/**
* 在main方法前,可先不声明,只有类中定义的函数才允许public修饰符
*/
void hello2(){
cout << "Hello2, World!";
}
int main() {
hello();
hello2();
return 0;
}
/**
* 函数实现
* 如果再main方法后实现,必须先声明
* @return
*/
int hello(){
cout << "Hello, World!";
}
方法参数
Java
public void hello(String name){
System.out.print("Hello, " + name + "!");
}
C++
void hello(string); // C++ 函数声明阶段
或者
void hello(string name); // 声明阶段可以带名字,可以不带
int main(){
string aa;
hello(aa);
}
void hello(string name){
cout << "Hello, " + name + "!";
}
参数默认值
Java
public void hello(String name) {
if (name == null) {
name = "World";
}
System.out.print("Hello, " + name + "!");
}
C++
void hello(string = "World"); // 声明阶段,添加默认值World
int main() {
hello();
return 0;
}
/**
* 函数实现
* 如果再main方法后实现,必须先声明
* @return
*/
void hello(string name) {
cout << "Hello, " + name + "!";
}
方法Return
Java
public boolean hasItems() {
return true;
}
C++
bool hasItems() {
return true;
}
单表达式
Java
public double cube(double x) {
return x * x * x;
}
C++
double cube(double x) {
return x * x * x;
}
类->New
Java
File file = new File("file.txt"); //对象在堆中,对象引用在栈中
C++
class Test {
public:
void add() {
}
};
int main() {
Test test1; //栈中分配 ,由操作系统进行内存的分配和管理
Test *test1; //加*表示为指向Test类对像的指针变量,不加*则为Test类对像
Test *test = new Test(); //堆中分配 ,由管理者进行内存的分配和管理,用完必须delete(),否则可能造成内存泄漏
delete test;
return 0;
}
注意:栈中内存的分配和管理由操作系统决定,而堆中内存的分配和管理由管理者决定
类->不可被继承
Java
public final class User {
}
C++
//C++11的新特性
class User final {
};
类->不可被继承的成员变量
Java
class User {
private final String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
C++
class User {
private:
const string u_name; // const限制只能被赋值一次
public:
User(string name); // 声明
};
User::User(string name) : u_name(name){}; //实现
int main() {
User user = User("test");
return 0;
}
类-> 可选的构造参数
Java
final class User {
private String name;
private String lastName;
public User(String name) {
this(name, "");
}
public User(String name, String lastName) {
this.name = name;
this.lastName = lastName;
}
// And Getters & Setters
}
C++
class User {
private:
string u_name;
string u_last_name;
public:
User(string name,string lastName);
};
User::User(string name,string lastName = "1") : u_name(name) ,u_last_name(lastName){};
int main() {
User user = User("test");
User user1 = User("test","1");
return 0;
}
抽象类
Java
public abstract class Document{
public abstract int calculateSize();
}
public class Photo extends Document{
@Override
public int calculateSize() {
}
}
C++
/**
* 抽象类
* 需要用纯虚函数
* 纯虚函数是通过在声明中使用 "= 0" 来指定
*/
class Document{
public:
virtual int calculateSize() = 0; //纯虚函数
};
class Photo : Document{
public:
int calculateSize() override{
cout << "Photo";
return 10;
}
};
int main() {
Photo photo;
photo.calculateSize();
return 0;
}
单例
Java
public class Document {
private static final Document INSTANCE = new Document();
public static Document getInstance(){
return INSTANCE;
}
}
C++
//懒汉版
class Document {
private:
static Document *document;
private:
Document() {};
~Document() {};
Document(const Document &);
Document &operator=(const Document &);
private:
class Deletor {
public:
~Deletor() {
if(Document::document != NULL)
delete Document::document;
}
};
static Deletor deletor;
public:
static Document *getInstance() {
if (document == NULL) {
document = new Document();
}
return document;
}
};
在程序运行结束时,系统会调用静态成员deletor的析构函数,该析构函数会删除单例的唯一实例。使用这种方法释放单例对象有以下特征:
- 在单例类内部定义专有的嵌套类。
- 在单例类内定义私有的专门用于释放的静态成员。
- 利用程序在结束时析构全局变量的特性,选择最终的释放时机。
枚举类
Java
enum Color
{
RED, BLUE, WHITE, BLACK};
}
C++
enum Color {RED, BLUE, WHITE, BLACK}; // 定义枚举类型Color
enum fruit_set {apple, orange, banana=1, peach, grape}
//枚举常量apple=0,orange=1, banana=1,peach=2,grape=3。
编译系统为每个枚举常量指定一个整数值,默认状态下,这个整数就是所列举元素的序号,序号从0开始。 可以在定义枚举类型时为部分或全部枚举常量指定整数值,在指定值之前的枚举常量仍按默认方式取值,而指定值之后的枚举常量按依次加1的原则取值。
总结一下
本期,我对比了函数,类,抽象类,单例,枚举等,整体上大同小异,你可能也注意到了一些细节的不同,其实大多时候都是很小的细节决定了问题的产生,虽然我可以通过这两篇的文章快速的了解C++,但还是不够,需要更深入的研究和学习,下期我们就针对某些细节以及一些概念的理解,来完成C++的从入门到精通。加油。
网友评论