From Java to C++ 第二篇

作者: i校长 | 来源:发表于2021-05-08 12:55 被阅读0次

    第一篇:
    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++的从入门到精通。加油。

    相关文章

      网友评论

        本文标题:From Java to C++ 第二篇

        本文链接:https://www.haomeiwen.com/subject/podudltx.html