JNI基础 -- C++基础知识(类的构造 )
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中的私有成员变量。