首页 > 编程语言 >[3] C++面向对象编程

[3] C++面向对象编程

时间:2024-03-11 18:13:48浏览次数:29  
标签:函数 右值 int C++ Num 面向对象编程 内联 cout

Day1

函数指针数组

简写函数指针 typedef

typedef int (*FunPtr)(int, int);

FunPtr FunArr[1] = {Add};

内联函数

#pragma region 内联函数
    // 避免函数跳转对于程序的额外开销
    // 有两种写法 1).h中写实现文件(在.h中同时写声明和实现)    
    // 2)inline 关键字
        // 如果声明和实现拆开,都需要加inline
        // 声明和实现写道一起,然后加inline(推荐)

    // 注意点   到底是不是内联函数取决于编译器自己决定
        // 即使按照上面的写法,编译器也可以不认为这是一个内联函数
        // 即使不按照上面的写法,编译器可以认定这是一个内联函数
        // 内联函数中不允许出现循环和switch,代码不能超过十行,递归函数不能是内联函数
    // 存取函数   推荐写成内联函数  GetXX  SetXXX

    // 本质 在调用内联函数时编译器会对内联函数进行展开替换
    // 虚幻中可以强制指定某个函数必须是内联
    //cout << TestAdd(1, 2);
     //cout << TestAdd(1 ,2) << endl;
#pragma endregion

// 声明和实现拆开
inline int TestSubtract(int Num1, int Num2);

// 声明和实现写在一起
inline int Multiply(int Num1, int Num2) { return Num1 * Num2; }

#pragma region 宏
    // #define 定义的叫做宏 Macro

    // 宏的本质是单纯的替换,不检查类型
    // 宏的替换出现在预编译阶段(预处理指令)
    // 宏一般都是全大写字母,有的时候需要加上_区分   _FILENAME_   FILE_NAME  __FILENAME__(系统保留宏)
    //Divide(10, 5);
    cout << __FILE__ << endl; // 表示当前文件的完整路径
    cout << __LINE__ << endl; // 表示代码所在的行数
    cout << __LINE__ << endl;

     //常量宏  参考 Util.h
    //宏中带参数
    cout << ADD(10, 20) << endl;
    cout << ADD(10, 20);

    int Result = 10 % MULTIPLY(50, 2);
    Result = 10 % 50 * 2;
    cout << Result << endl; // 10 

    int Max = MAX(10, 50); // (((10) > (50)) ? (10) : (50))
    cout << Max << endl;

//声明
// 如果宏带参数的 参数和计算结果用()括起来
#define MULTIPLY(Num1, Num2) ((Num1) * (Num2))
// 用inline函数代替带参数的宏
// inline int Multiply(int Num1, int Num2) { return Num1 * Num2; }

#define MAX(Num1, Num2) (((Num1) > (Num2)) ? (Num1) : (Num2))

#define _COUT_(Begin, End) for(int i = Begin; i < End; ++i) \ //宏定义函数
{\
	cout << i << endl;\
} // 最后一行不需要加 (\)

#define _APPEND_(Name) "Hello, "##Name //字符串拼接


#pragma endregion

常量

#pragma region 常量
    //// 常量  一旦初始化完成就不能改变  const
    const int Num = 100; // 常量在声明的时候必须初始化,否则报错
     Num = 150; // 不允许改变值

    int Num1 = 100;
    const int Num2 = Num1; // 可以用变量取初始化常量,变量的值改变不会影响常量
    Num1 = 1000;
    cout << Num2 << endl;

    int Num3 = 5000;

     //const跟指针变量连用 三种情况
    int* pNum = &Num1; // 1000
    const int* pNum1 = &Num1;
    pNum1 = &Num2; // 可以指向别的变量
     *pNum1 = 3000; // 不能通过解引用修改值


    //int* const pNum2 = &Num3;
    //// pNum2 = &Num1; // 不可以指向别的变量
    //*pNum2 = 8000; // 可以通过解引用修改值
    

    const int* const pNum3 = &Num2;
    pNum3 = &Num1; // 不能指向另外一个变量
    *pNum3 = 500; // 不能通过解引用修改值


#pragma endregion

引用

  &引用内存地址 : 

  引用地址和内存的关系

  引用注意点

  引用符号&和指针符号*的区别

#pragma region 引用

	//int Num = 50;
	//int& Num1 = Num;
	//Num1 = 123;
	////cout << &Num << " " << &Num1 << endl; //引用的地址
	////cout << Num << " " << Num1; // 地址里面的值

	//int Temp = 5000;
	//Num1 = Temp;
	//cout << Num << " " << Num1 << endl; //因为Num的地址和Num1的内存的地址是一样的 , 101行会影响到 Num的值
	//Num1 = 500; // Num也同步被更改了
	//cout << Num << " " << Temp << endl;
	//cout << &Num1 << " " << &Num << " " << &Temp << endl;// Num1 Num地址一样 Temp不一样;

	//----------

	int Num1 = 50;
	int Num2 = 500;

	//调用的时候不传递地址 , 函数接受用 & 取地址
	//Swap(Num1, Num2);
	//cout << &Num1 << " " << &Num2 << endl; //地址和函数内一样


	//调用的时候不传递地址 
	//Swap1(Num1, Num2);
	//cout << &Num1 << " " << &Num2 << endl; //地址和函数内一样


	//调用的时候传地址
	//cout << &Num1 << " " << &Num2 << endl << endl; //
	//Swap(&Num1, &Num2);

	//cout << Num1 << " " << Num2 << endl;

	//--------字符串引用
	cout << TestStr("hello"); //这种引用函数里面需要加 const
	string Str = "hello";
	cout << TestStr(Str); 

#pragma endregion

左值右值

#pragma region 左值右值
   // 左值   可以放到 = 左边的
   // 右值   不可以放到 = 左边的(字面量   常量和指针连用)
   // 右值引用  int&& 
    int Num = 10;
    Num = 100;
    // int&& rNum = Num; // 不能把变量赋值给右值引用 
    int&& rNum = 10; // 右值引用只能赋值字面量(右值)
#pragma endregion

 

标签:函数,右值,int,C++,Num,面向对象编程,内联,cout
From: https://www.cnblogs.com/Aquakinn/p/18065453

相关文章

  • C++学习笔记
    第一章认识C++1.1命名空间1.1.1命名空间的基本格式命名空间是一个由用户自己定义的作用域,在不同作用域中定义相同变量,不会冲突。命名空间中可以存放以下类型,这些定义/声明在结构体中的内容成为实体变量常量函数(可以是定义或声明)结构体类模板命名空间(可以嵌套定义)......
  • error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft
       Defaultingtouserinstallationbecausenormalsite-packagesisnotwriteableCollectingPyQt5-sipUsingcachedPyQt5_sip-12.13.0.tar.gz(123kB)Installingbuilddependencies...doneGettingrequirementstobuildwheel...donePreparing......
  • 函数回调(C++)
    函数回调C++部分​ 从C#逆向理解回去,这玩意应该就是delegate的原型了,只不过C#中将其作为一个单独的变量类型方便做管理,而C++这个老毕登这里则是以指针的形式表现出来。​ 作用在于,你不需要关心函数具体内容是什么,也不需要关心函数到底会处理什么,你只需要直接调用这个定义了的回......
  • C++单例 singleton的实现
     在这个单例模式的实现中,使用了静态局部变量来确保只有一个实例。 静态局部变量只会在第一次调用函数时初始化,并且在程序的整个生命周期内保持其值不变。这意味着,无论多少次调用getInstance()方法,都只会在第一次调用时创建一个实例,后续的调用会返回同一个实例。 具体来......
  • C++ 面试题 1
    C++面试题1.详细说说C/C++中malloc、free和new、delete的异同点在C和C++中,malloc和free以及new和delete是用于动态内存管理的两组函数/操作符。虽然它们的目的相似,但在使用方式和特性上有一些重要的区别。malloc和freemalloc和free是C语言的标准库函数,用于在堆上分配和释放内......
  • C++中不同容器下迭代器失效的情况
    C++中不同容器下迭代器失效的情况迭代器失效分三种情况考虑,也是分三种数据结构考虑,分别为数组型,链表型,树型数据结构。数组型数据结构:该数据结构的元素是分配在连续的内存中,insert和erase操作,都会使得删除点和插入点之后的元素挪位置,所以,插入点和删除掉之后的迭代器全部失效,也就......
  • C++左值右值完美转发转移
    左值(Lvalue)与右值(Rvalue)英文含义:左值(Lvalue):Locatorvalue,意味着它指向一个具体的内存位置。右值(Rvalue):Readvalue,指的是可以读取的数据,但不一定指向一个固定的内存位置。定义左值:指的是一个持久的内存地址。左值可以出现在赋值操作的左侧或右侧。例如,变量、数组的元素......
  • [c++] c++ 中的左右值
    c++中的左右值前言:最近又需要再次复习一下关于c++中lvaue和rvalue相关的知识。左值和右值简单看inta=1;这条语句,对于左边的a,我们是可以对其取地址的,而对于右边的1来说,我们无法对其去地址。对于能够取地址的a,位于=左边,我们就将其称之为左值,对于像1这样的......
  • C++ 17新特性
    C++17是C++语言的一个重要版本,引入了许多新特性和改进,以提高开发效率和代码质量。以下是一些常用的C++17新特性:结构化绑定(StructuredBindings):允许以声明式语法将复合类型(如元组、数组、结构体)中的成员绑定到变量上,从而简化代码并提高可读性。#include<tuple>std::tup......
  • C++ Qt开发:QNetworkInterface网络接口组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QNetworkInterface组件实现查询详细的网络接口参数。在Qt网络编程中,QNetworkInterface是......