C++学习笔记(二)——C++基础知识

一、常用语法知识:

1.getline(cin, inputLine);

(1)参数:第一个就写成cin就行,第二个是string类的,不能是char字符串数组那种。
(2)可以用这种方式判断文件读入是否结束 while( getline (cin, inputLine) )。
(3)这个getline结束读入有几种情况:一是用户敲回车符,二是遇到文件结束。
(4)这个string类的字符串需要用cout输出,不能用printf()
(5)cin遇到空格,制表符,回车符就停止读入了。

2.goto

(1)这个东西不怎么建议去用,但是可以用于跳出多重循环,举个栗子(程序可以直接从goto跳到loop,loop后边要加冒号,可以不加分号):

int sum = 0;
for(int i = 0; i < 100; i++){
    for(int j = 0; j < 100; j++){
        sum++;
        if(sum > 10){
            goto loop;
        }
    }
}
loop:

3.随机数

(1)引用cstdlib,先调用void srand(unsigned int seed),设置种子,再调用随机数函数int rand(void),就可以产生随机数了。它生成一个闭区间[0,RAND_MAX]内的均匀随机整数(均匀的含义是:该区间内每个整数被随机获取的概率相同),其中RAND_MAX至少为32767(2^15 -1),在不同环境下的值可能不同。

#include<cstdio>
#include<cstdlib>
using namespace std;
int main()
{
    srand(1);
    for(int i = 0; i < 20; i++){
        printf("%d\n", rand());
    }
    return 0;
}

4.内联函数

格式:类型说明符 函数名(含类型说明的形参表){ 语句序列 }

(1)函数调用是需要时间开销的。把一个反复调用的简单函数可以定义为内联函数。
(2)需要强调的是,编译器并不承诺将inline修饰的函数作为内联。且递归函数不可以作为内联函数。
(3)内联函数体内不能有循环语句和switch语句
(4)内联函数的定义必须出现在内联函数第一次被调用之前。
(5)对内联函数不能进行异常接口声明。

5.引用

(1)注意,定义引用时一定要初始化为引用某个变量;初始化后,就一直引用该变量,不能再引用其他变量;引用只能引用变量,不能引用常量或是表达式。
(2)函数形参列表中可以用引用,可以改变实参的值。
(3)当然,引用也可以作为函数的返回值。
(4)引用前加const,可以变成常引用,不可以通过常引用改变所引用的内容。
(5)常量引用与引用是两种类型,引用可以给常量引用赋值,反之则不行(除非强制类型转换)。

//r的类型是int&,等价于这个变量,只是相当于一个别名
int n = 4;
int& r = n;

 6.常量:

(1)可以定义常量指针:const int *p = &n(这个是取地址运算符,区分开),不可以通过常量指针修改其指向的内容。
(2)不可以把常量指针赋值给非常量指针(除非强制类型转换),但反之可以。
(3)函数参数为常量指针,可以避免修改函数内部不小心修改参数指针所指向地方的内容。

void MyPtint(const char *p) { printf("%s", p); }

7.动态内存分配。

(1)分配一个变量:P = new T,T为任意类型名,P的类型是T *。
(2)delete P,这样可以释放P占用的内存空间,且相同内存空间释放操作只能进行一次。注意,new动态分配的空间要用delete释放掉。
(3)new的另外一种用法是可以动态分配数组,且要这样用delete释放动态分配的数组:

int *p = new int[20];
p[0] = 20;
delete []p;

8.联合(C++版)

(1)定义形式

union 联合体名称{
    公有成员
protected:
    保护型成员
private:
    私有成员
};

(2)成员共用同一组内存单元。
(3)任何两个成员不会同时有效。
(4)无名联合:

union{
    int i;
    float
}
//在程序中可以直接这样使用
i = 10;
f = 2.2;

9.枚举

(1)语法形式:enum class 枚举类型名:底层类型{枚举值列表}

//底层类型不写默认是int
enum class Type {General, Light};
enum class Type: char {General, Light};
enum class Category {General = 1, Pistol};

(2)枚举优势:

  • 作用域限制在枚举类之中,只能这样使用枚举值:枚举类型名::枚举值。
  • 转换限制:枚举类对象不可以与整型隐式地互相转换。
  • 可以指定底层类型:enum class Type: char {General, Light};

(3)注意,不同类型的枚举类不能直接比较(就算底层类型相同也不行),会引发编译错误。

10.多文件

(1)C++程序一般的组织结构:

  • 一个工程可以划分为多个源文件,例如:类声明文件(.h文件),类实现文件(.cpp),类的使用文件(main()所在的.cpp文件)。
  • 利用工程来组合各个文件。

(2)将变量和函数限制在编译单元内:用匿名命名空间中定义的变量和函数,都不会暴露给其他的编译单元。

namespace{ //匿名的命名空间
    int n;
    void f(){
        n++;
    }
}

(3)编译预处理

  • #include:将一个源文件嵌入到当前源文件中该点处。
  • #include<文件名>:按标准方式搜索,文件位于C++系统目录的include子目录下。
  • #include "文件名":首先在当前目录中搜索,若没有,再按标准方式搜索。
  • #define:定义符号常量,很多情况下已经被const定义语句取代。
  • #define:定义带参数宏,已被内联函数取代。 
  • #undef:删除由#define定义的宏,使之不再起作用。
  • 条件编译指令(#else可有可无)
#if 常量表达式 
//当“常量表达式”非零时编译。
    程序正文1

#else  
//当“常量表达式”为零时编译
    程序正文2
#endif
#ifdef 标识符
    程序段1
#else
    程序段2
#endif

如果“标识符”被 #defind 定义过,而且未经undef删除,则编译程序段1,否则编译程序段2

二、有点不常见的C++知识

1.<sstream> 定义了三个类:istringstream、ostringstream 和 stringstream,分别用来进行流的输入、输出和输入输出操作。

2.typedef 可以把已有的同一个数据类型定义为多个别名。
如:typedef double Area, Volume;

3.enum 枚举变量名 {变量值列表}

4.函数的形参可以有默认值,但是必须在形参列表的最后。默认值也叫函数的缺省值,调用函数的时候,相应的位置可以不写参数。

void func(int x1, int x2 = 2, int x3 = 3){}
func(10);
func(10,8);  //等价于func(10, 8, 3);

 但是,只允许最右边若干个参数有缺省值,不可以func(10, , 8),这样是不对的。

5.函数重载是有条件的。必须满足形参类型不同或形参个数不同两个条件中的一个。但是,编译器不以形参名来区分函数,也不以返回值的类型来区分函数。

三、C++ 11新特性和C++高级主题

  • C++11 新特性

1.constexpr函数

(1)在所有参数都是constexpr时一定返回constexpr。
 

  • 强制类型转换

  • 异常处理

猜你喜欢

转载自blog.csdn.net/qq_45812711/article/details/104109514
今日推荐