C++系列一:语言基础-杂烩1

发布时间 2023-08-10 13:03:46作者: cactus9


前言

开始认真学习了,动真格了哟。
下列内容主要是搜集整理,方便日后查看复习!


一、参考链接

  1. 嗨客网
  2. 菜鸟教程
  3. 多啦A梦
  4. CPLUS
  5. 在线编辑 菜鸟教程也有

二、预处理

理论学习:
所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。预处理是 C++ 的一个重要功能, 它由预处理程序负责完成。当对一个源文件进行编译时, 系统把自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。
作用:

将预处理指令分成三大类,
第一类是文件包含类预处理指令,
第二类是宏定义类预处理指令,
第三类是条件编译类预处理指令。

#include //包含一个源代码文件,头文件
#define	//定义宏
#undef	//取消已定义的宏
#if	    //如果给定条件为真,则编译下面代码
#ifdef	//如果宏已经定义,则编译下面代码
#ifndef	//如果宏没有定义,则编译下面代码
#elif	//如果 #if 条件不为真,当前条件为真,则编译下面代码
#endif	//结束 #if… 到 …#else 条件编译快
#error error-message //在编译期间给出一个错误信息,并终止程序的编译。

//重点是宏 宏变量和宏函数 内置宏定义
__LINE__	  //整型值	当前行号
__FILE__	  //字符串类型	当前文件名
__FUNCTION__  //字符串类型	当前的函数名
__DATE__	  //字符串类型	编译的日期
__TIME__	  //字符串类型	编译的时间
__STDC__	  //预定义的宏
#define  PI  3.14
#define INT_PTR int* //int a = 1024; INT_PTR ptr = &a;
#define SQ(x) x*x   // int sqx = SQ(5+5);=>35=> 5+5*5+5
#define SQ(x) ((x)*(x)) //推荐将参数都带上括号
#define MAX(x, y)     (((x) > (y)) ? (x) : (y))
#define MIN(x, y)     (((x) < (y)) ? (x) : (y))

//条件编译
#define PRINT
#ifdef PRINT //#ifndef PRINT  //#if =>条件表达式
 	cout << "Print has defined" << endl;//编译该段代码
#else
	cout << "Print not defined" << endl;
#endif
	return 0;

三、函数

太熟悉了,都是这么回事
为了完成某一功能的程序指令(语句)的集合,称为函数

  1. 内联函数 和 普通函数 最大的区别:在于内部的实现方面,当普通函数在被调用时,系统首先跳跃到该函数的入口地址,执行函数体,执行完成后,再返回到函数调用的地方,函数始终只有一个拷贝。
    而内联函数则不需要进行一个寻址的过程,当执行到内联函数时,此函数展开(很类似 宏 的使用),如果在 N 处调用了此内联函数,则此函数就会有 N 个代码段的拷贝。
int sum(int a, int b=10)
{
	return a + b;
}
//可变参数
#include <cstdio>
#include <cstdarg>
#include <iostream>
using namespace std;
int mulSum(int n, ...)
{
    int i = 0;
	int sum = 0;
	va_list argptr;
	va_start(argptr, n);             // 初始化argptr
	for (i = 0; i < n; i++)  // 对每个可选参数,读取类型为int
	{
		sum += va_arg(argptr, int);    //累加到 sum 中
	}
	va_end(argptr);
	return sum;
}
int main()
{
	cout << "嗨客网(www.haicoder.net)\n" << endl;
	int mulSumRet = mulSum(4, 1, 3, 5, 8);
	cout << "MulSumRet = " << mulSumRet << endl;
	return 0;
}

小记

理念:

  • 常量成员 const:
    1.const成员必须被初始化且只能在初始化列表中赋值(不能在构造函数原型中赋值)
    2.const成员初始化之后无法更改
  • 静态成员 static:
    1.static成员必须被初始化且只能在类的外部初始化,且不能带static关键字(通过类::变量赋值)
    2.static成员可以在构造函数原型中被更改(不能在初始化列表中初始化)
    3.static成员被所有的此类共享
  • 静态常量成员 static const:
    1.static const成员必须被初始化且只能在类的外部初始化,且不能带static关键字,必须带const关键字
    2.static const成员不能在初始化列表中初始化、构造函数原型中被更改、外部更改
    3.static const成员被所有的此类共享
  • 静态成员函数 static void change():
    1.调用方式为 :类名::函数名。
    2.静态成员函数不能包含内部任何形式的非静态成员
    3.静态成员函数可以接受外部参数
  • this 指针:
    1.this 指针是一个特殊的指针,它指向当前对象的实例。(所以不能加点,不能用于被static修饰变量和函数)
    2.友元函数没有this指针。
  • 内联函数:
    在函数声明前加上关键字inline,或着在函数定义前加上关键字inline
//1. 构造函数
#include <iostream>
using namespace std;
class Student {
public:
    int m_age;
    int m_score;
    // 1.内部赋值方式
    Student(int age, int score) {
        m_age = age;
        m_score = score;
    }
    // 2. 一般构造函数
    // 初始化列表方式
    Student(int age, int score) :
        m_age(age),
        m_score(score)
        {}
     // 3. 复制构造函数
    Student(Student& s) {
        m_age = s.m_age;
        m_score = s.m_score;
        cout << "3.  复制构造函数" << endl;
    }
    // 4. 移动构造函数 //愿闻其详
};
Student stu1;           // 调用无参构造函数
Student stu2(21, 20);   // 调用一般构造函数
Student stu3(stu1);     // 调用复制构造函数

2. 匿名函数的引用限制
/*
[]:默认不捕获任何变量;
[=]:默认以值捕获所有变量;
[&]:默认以引用捕获所有变量;
[x]:仅以值捕获x,其它变量不捕获;
[&x]:仅以引用捕获x,其它变量不捕获;
[=, &x]:默认以值捕获所有变量,但是x是例外,通过引用捕获;
[&, x]:默认以引用捕获所有变量,但是x是例外,通过值捕获;
[this]:通过引用捕获当前对象(其实是复制指针);
[*this]:通过传值方式捕获当前对象;	
*/