20:C++01:引用和重载
1. C 和 C++的区别
- C++里面可以写C的代码,可以混编C。
但是C里面,不能混编C++的代码。
- C++里面可以写C的代码,可以混编C。
- C++ 面向对象(Java类似),c 面向过程,比java更强大,更适合处理底层。
需要自己回收。
- C++ 面向对象(Java类似),c 面向过程,比java更强大,更适合处理底层。
- 很多的开源框架大部分都是 c++ 写的 (大部分基于 c++ )
printf("Hello world!"); // C的打印
#include <iostream> // c++的包
using namespace std; // 命名的空间,相当于java中的类部内。
// 它可以简化代码编写:`cout << "Hello World!" << endl;`
// c++ 打印 opencv << 操作符的重载,kotlin里面有很多操作符重载。
std::cout << "Hello World!" << std::endl;
2. 常量(不能改)
const int number = 30; // 不能改,但是可以通过地址修改里面的值(C里面可以)
// number =90;
int* numberP = &number; // 获取不到地址,怕通过地址去修改值。但是C语言里面是可以的,c++某些编译器是可以通过的,但是不能运行。
*numberP = 100;
printf("%d,", number);
3. 引用和常量引用
传指针, 传引用(一块内存的别名)。
// 3.引用--- 交换值
void swap(int* number1,int* number2){ // 传地址
int temp = 0;
temp = *number1; // 交换地址里面的值
*number1 = *number2;
*number2 = temp;
}
void swap(int &number1, int &number2){ // 引用&, 也能完成交换。
cout << "swap number1的地址" << &number1 << endl;
int temp = 0;
temp = number1;
number1 = number2;
number2 = temp;
}
void main(){
int a = 10;
// int b = a; // 这个地址不一样
int &b = a; // 给a指向的内存取另外一个别名 b,b没有重新开辟空间。
b = 20; // a的值也成了20.
cout << "a的地址" << &a << endl;
cout << "b的地址" << &b << endl;
cout << "a的值" << a << endl;
cout << "b的值" << b << endl;
// 交换值
int number1 = 10;
int number2 = 20;
// 引用: 四驱模型值的拷贝,引用其实是地址赋值 ,可以看成同一块内存的另外一个变量
cout << "main number1的地址" << &number1 << endl;
// swap(&number1, &number2);
swap(number1, number2);
cout << "number1 = " << number1 << " , number2 = " << number2 << endl;
getchar();
}
// 常量引用的使用。
typedef struct
{
char name[20];
int age;
} Student;
void insertStu(const Student &stu){// stu 不想改 常量引用,使用const修饰。指向不能改动,里面的值也不能改动。
// 可以修改 stu 的值
// strcpy (stu.name,"Jack"); // 能修改name的值,const修饰不能修改。
// const 就变成了只读的属性
cout << stu.name << "," << stu.age << endl;
}
void main(){
Student stu = {"Darren",20};
insertStu(stu);
cout << stu.name << "," << stu.age << endl;
getchar();
}
4. 方法的重载和默认参数
// 1.函数重载和默认参数,默认参数number2、cache
int add(int number1, int number2 = 200, bool cache= 0){ // number2 = 200 默认的参数 跟kotlin 很像
return number1 + number2;
}
// 错误 1 error C2084: 函数“int add(int,int)”已有主体 c 不允许函数的重载
int add(int number1, int number2, int number3){
return number1 + number2 + number3;
}
void main(){
int number1 = 100;
int number2 = 200;
int sum = add(number1, 200); // 可以传1个,2个,3个参数
printf("sum = %d\n", sum);
// bool 类型
bool cache = -100;// 0 和 !0
if (cache){
cout << "true" << endl;
}else {
cout << "false" << endl;
}
getchar();
}
5.类的初探【重要】
继承、多态、封装。
class Student{ // 非常像java的类class 定义
private: // 影响下面所有的属性
char* name;
public:
int age;
public:
void setAge(int age){
this->age = age; // 自带了个this的指针
}
void setName(char* name) {
this->name = name;
}
// private: // 影响下面的方法
int getAge(){ return this->age; }
char* getName(){ return this->name; }
};
void main() {
// new出来的是一个指针,指针的属性访问,都要用箭头。new 和delete是一套的。
Student stu = new Student();
stu->setName("LIly");
stu->age = 23; // public的变量可以直接 点访问。
cout << stu->getName() << "," << stu->getAge() << endl;
delete(stu); // 释放指针
}
6.开发过程中怎么用。
// 补充:开发过程中(重要)直接写的问题所在 Student.cpp 是一个单独类 Student.cpp
// 它会编译成一个 so 库(不能直接引入它了),必须要有一个头文件 Student.h
- class定义类,跟java几乎类似
- 开发过程中,我们的cpp文件或c文件,最终会编译成 .dll动态库 或 .so库,供调用者使用。
所以为了确保类能被正常调用,我们一般需要 定义.h头文件。 - 实现方法的时候,要用命名空间 xxx类名::xxx方法名。 指定是实现的那个类中的哪个方法,避免出问题。
// Student.h 头文件,只有方法和属性的声明
class Student{ // 结构体类似
public: // private 私有,包装,影响下面所有的属性
char* name;
int age;
public:
void setAge(int age); // 方法声明
void setName(char* name);
int getAge();
char* getName();
};
// Student.cpp 文件。方法的实现类。
#include "Student.h" // 先导入Student头文件
// 直接写实现 ,相当于定义了另外一个方法
void setAge(int age){}
void Student::setAge(int age){// 实现 Student 的 setAge 方法
this->age = age;
}
void Student::setName(char* name){
this->name = name;
}
int Student::getAge(){
return this->age;
}
char* Student::getName(){
return this->name;
}
#include "Student.h"
// 0 1 2: 0 打印, 1 上传到后台, 2 友盟和服务器. 预留一个参数不使用。int tag可以直接写成int。
void printLog(char* content, int tag) {// 自己平台打印,产品说了下个版本可能要上传到服务器,友盟也要备一份
cout << content << endl;
// 补功能 有可能...... 根据第二个参数,添加不同的功能
if(tag==1) {}
}
void main(){
// new ,new 出来的是一个指针
Student *stu = new Student();
stu -> setName("Darren");
stu -> age = 24;
cout << stu -> getName() << " , " << stu -> getAge() << endl;
printLog("xxxx", 0);// 100个地方调用,带状态码
printLog("xxxx", 1);// 100个地方调用,带状态码
printLog("xxxx", 2);// 100个地方调用,带状态码
delete(stu); // 释放指针
getchar();
}
kotlin 语言 开发速度更快。
网友评论