JNI基础 -- C++基础知识(类的构造 )

2020-04-18  本文已影响0人  刘小厨

C++类的构造

简述: C++编程的特点:C++是在C语言的基础上进行扩充和完善,使C++兼容了C语言的面向过程特点,又成为了一种面向对象的程序设计语言

构造函数&析构函数

首先我们声明一个Student_H.h的头文件,Vistual Studio会自动生成一行代码#pragma once,这句代码主要会为了防止该头文件被重复引用(重复引用编译会不通过),但是这种方式很多编译器都不支持,我们可以通过定义的方式来处理

简单的头文件声明代码如下:

#pragma once
//定义宏,防止头文件被重复引用
#ifndef Student_H
#define Student_H

//class 定义一个类 和Java一样
class Student
{
    int age;
    //C++中也有作用域的概念,通过public: private:等声明,
    //相同作用域的方法放在同一个关键字下
    //将public方法都声明在public:下,与java不同
public:
    //声明构造函数,和Java一样,默认空参构造
    Student();
    //析构函数,析构函数和构造函数成对出现
    ~Student();
private:
    int j;
protected:
    int k;
public:
    int l;
};
#endif // !Student_H

可以看到C++和C还是有很大区别的,像上面public 的构造函数是典型的面向对象的编程特点

接下来我们创建一个Student.cpp文件,引入Student_H头文件
因为我们在头文件中声明了构造函数析构函数,所以要在Student.cpp文件中实现,方式如下:

#include "Student_H.h"
#include <iostream>
//C++一般通过std进行打印,引入std命名空间,是一个标准的输入输出的函数
using namespace std;

Student::Student() {
    cout<< "构造方法" << endl;//endl表示换行
}

//析构函数和构造函数成对出现
Student::~Student() {
    cout << "析构方法" << endl;
}

当通过构造函数创建Student对象时,会分配内存区域,当释放内存的时候会调用析构函数。C++ 虽然是面向对象形式的编程语言,但是内存要我们自己管理。
我们在main()函数中声明一个Student对象:

#include <iostream>
#include "Student_H.h"

int main()
{
    Student student;
    return -1;
}

控制台输出为:

构造方法
析构方法

从控制台输出可以看出: 创建Student调用了构造方法,在main()方法执行完毕,调用了析构方法,对象的创建和销毁。析构方法不是我们手动调用,实在内存销毁时,系统自动调用

如果我们声明的构造函数为有参构造例如:

Student(int i,int j);//头文件中声明,ccp文件中实现

如果我们想将构造传进来的参数赋值给成员变量可以这样:

Student::Student(int i,int j) {
    this->age = i;
    this->j = j;
    cout<< "构造方法" << endl;//endl表示换行
}

也可以这样写:

Student::Student(int i,int j) : age(i),j(j){
    cout<< "构造方法" << endl;//endl表示换行
}

当然我们也可以在头文件中声明一个普通方法,比如在public:下声明一个setJ(int j)方法
那么在ccp中的实现就要按照C++的格式,如下:

//头文件中public:下声明
void setJ(int j);

//cpp中实现
void Student::setJ(int j) {
}

常量函数

常量函数的关键字是const,如果我们将上面代码中的setJ()方法用const修饰:

//.h头文件中的声明
void setJ(int j) const;
//.cpp文件中 的实现
void Student:: setJ(int j) const{
    this->age = j;
}

这样编译器会报错,因为被关键字const修饰的函数是不会也不允许修改类中的成员,const关键字的目的是用于保护成员变量

友元函数

如果我们想在main.cpp中访问并修改Student的private类型的变量,就需要借助友元函数
写法如下:

//在.h头文件中声明,方法签名要和调用的方法一致
friend void test(Student* student);

//main.cpp中调用
void test(Student* student) {
    student->j = 100;
}

友元类

上述友元函数如果有很多外部类需要访问私有成员变量,写起来就会很麻烦,我们可以通过友元类来解决这个问题:
需要在.h头文件中声明一个类,并设置为Student的友元类

class Teacher
{
public:
    void call(Student* student) {
        student->j = 10;
    }

private:

};

Student中添加友元类

friend class Teacher;

我们就可以通过调用友元类的方法来访问Student中的私有成员变量。

上一篇 下一篇

猜你喜欢

热点阅读