美文网首页
NDK-020: C++01: 引用和函数重载

NDK-020: C++01: 引用和函数重载

作者: xqiiitan | 来源:发表于2025-01-07 09:36 被阅读0次

20:C++01:引用和重载

1. C 和 C++的区别

    1. C++里面可以写C的代码,可以混编C。
      但是C里面,不能混编C++的代码。
    1. C++ 面向对象(Java类似),c 面向过程,比java更强大,更适合处理底层。
      需要自己回收。
    1. 很多的开源框架大部分都是 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

  1. class定义类,跟java几乎类似
  2. 开发过程中,我们的cpp文件或c文件,最终会编译成 .dll动态库 或 .so库,供调用者使用。
    所以为了确保类能被正常调用,我们一般需要 定义.h头文件。
  3. 实现方法的时候,要用命名空间 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 语言 开发速度更快。

相关文章

  • 2.C++对C的扩展

    重载(overload) C++中,引用了函数重载的概念,函数名同名,参数列表不同形成重载。重载规则: 函数名相同...

  • js基础(二)

    引用 引用:是一个指向对象实际位置的指针。 函数重载和类型检查 在java语言中直接支持函数的重载,但在js中没有...

  • C++引用和函数的高级用法

    函数 内联函数重载函数默认递归函数 引用的概念 引用的定义和初始化引用是个别名引用的初始化引用作为目标的别名而使用...

  • 《C++ Primer Plus》:函数探幽

    本章内容概览 内联函数 引用变量 按引用传递函数参数 默认参数 函数重载 函数模板 内联函数 内联函数是C++为提...

  • JS之函数

    函数 每个函数都是 Function 类型的实例,而且都与其他引用类型一样具有属性和方法。函数没有重载,函数可以有...

  • [进阶]C++:函数重载

    定义重载函数 重载函数是函数名相同但是参数列表不同的函数 重载和const形参 const_cast 在重载函数中...

  • 2017-03-15 C++阶段

    Task List 1. 回顾引用与new用法 2. 学习模版template、重载函数、类(构造函数) Summ...

  • Callback / Callable 类型

    重载函数,和php的伪重载函数 重载函数a. c++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的...

  • 第十一章 引用和拷贝构造函数

    简介:引用是支持运算符重载语法的基础,也为函数参数的传入和传出控制提供了便利;拷贝构造函数;成员指针; 11.1 ...

  • Cocos2dx之C++基础(四)

    函数重载函数不以返回值来区分重载函数函数不以参数名来区分重载函数使用重载函数的时候不要引起二义性结构函数也可以重载...

网友评论

      本文标题:NDK-020: C++01: 引用和函数重载

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