C++系列一:语言基础-杂烩1
前言
开始认真学习了,动真格了哟。
下列内容主要是搜集整理,方便日后查看复习!
一、参考链接
二、预处理
理论学习:
所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。预处理是 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;
三、函数
太熟悉了,都是这么回事
为了完成某一功能的程序指令(语句)的集合,称为函数
- 内联函数 和 普通函数 最大的区别:在于内部的实现方面,当普通函数在被调用时,系统首先跳跃到该函数的入口地址,执行函数体,执行完成后,再返回到函数调用的地方,函数始终只有一个拷贝。
而内联函数则不需要进行一个寻址的过程,当执行到内联函数时,此函数展开(很类似 宏 的使用),如果在 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]:通过传值方式捕获当前对象;
*/