CPP_Details_Medium0.1

本文详细介绍了C++编程中的各种细节,包括手动编译、类型声明、枚举、指针操作、Lambda函数、随机数生成、动态内存管理、异常处理、多线程等内容,还有对C++特性的深入探讨,如结构体、类的区别,继承和多态的实现,以及文件操作等。
摘要由CSDN通过智能技术生成

1.手动编译:
单文件:

$ g++ test.cpp -o myname
$ ./ myname

多文件:

$ g++ test1.cpp test2.cpp -o myname
$ ./ myname

指定C++11标准:

g++ -g -Wall -std=c++11 main.cpp

2.声明typedef

typedef int dog;//支持安全检查,作用域块内
//增加dog为int的别名
#define dog int* //不支持检查,无作用域
#define WIDTH 5//#undef WIDTH可取消
#define MIN(a,b) (a<b ? a : b)//可定义参数宏define
#define MKSTR( x ) #x//可定义为字符串"x"
#define concat(a, b) a ## b//可定义为a*b

3.枚举enum

enum clolr {
   red,green,blue} c;
c = blue;
enum color {
    red, green=5, blue };//blue为6,red仍为0

4.同名时,使用::引用全局版变量,
::count//否则引用局部变量

5.宽字符常量
L’x’ 可存储于wchar_t类型的变量中

6.转义空格\t
可以输出空格

7.explicit,
防止构造函数的隐式转换发生;

Test t=12;//试图隐式转换,失败
Test t(12);//直接初始化,成功

8.static存储类
应用局部固定作用域内的值;
应用全局则将变量限制于该声明文件中。

9.thread_local 存储类
仅应用于数据声明和定义;不能用于函数声明或定义

10.^是异或,~是补码计算,<<是左移,>>右移

A   = 0011 1100
B   = 0000 1101
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A  = 1100 0011
A>>2= 0000 1111
A<<2= 1111 0000
A<<= 2//等同于 A=A<<2; 

11.while (x --> 0);
其实等价于while( (x–) > 0 );

12.for范围循环

int my_array[5] = {
   1, 2, 3, 4, 5};
for (int &x : my_array){
   sth.}

13.Lambda 函数

[capture](参数) mutable->返回值{
   body}//公式
auto add_x = [x](int a) mutable {
    x *= 2; return a + x; };//示例
[](int x, int y){
    return x < y ; }//标准示例
[]{
    ++global_x; }//无参数示例
[]{
   };//最简单的示例

auto Myname = [] {
    cout << "sth" << endl; };
Myname();//实用示例

注意:
Lambda 函数总是一个 const 函数,mutable 可以取消其常量性。
在使用该修饰符时,参数列表不可省略(即使参数为空)

[]      // 沒有定义任何变量。使用未定义变量会引发错误。
[x, &y] // x以传值方式传入(默认),y以引用方式传入。
[&]     // 任何被使用到的外部变量都隐式地以引用方式加以引用。
[=]     // 任何被使用到的外部变量都隐式地以传值方式加以引用。
[&, x]  // x显式地以传值方式加以引用。其余变量以引用方式加以引用。
[=, &z] // z显式地以引用方式加以引用。其余变量以传值方式加以引用。

14.对于[=]或[&]的形式,Lambda 表达式可以直接使用 this 指针。
但对于[]的形式,如果要使用 this 指针,必须显式传入:

[this]() {
    this->someFunc(); }();

15.C++随机数
如要产生 [m,n] 范围内的随机数num,可用:int num=rand()%(n-m+1)+m;
(即 rand()%[区间内数的个数]+[区间起点值])

#include <time.h>
srand((unsigned) time(NULL)); /*播时间秒数种子*/
 for(i = 0; i < 10; i++)
    {
   
        number[i] = rand() % 100; /*产生100以内的随机整数*/
        printf("%d ", number[i]);
    }

16.二维数组

int a[3][4] = {
     
 {
   0, 1, 2, 3} ,   /*  初始化索引号为 0 的行 */
 {
   4, 5, 6, 7} ,   /*  初始化索引号为 1 的行 */
 {
   8, 9, 10, 11}   /*  初始化索引号为 2 的行 */
};
等价于int a[3][4] = {
   0,1,2,3,4,5,6,7,8,9,10,11};
输出循环:
 int a[i][j] = {
   };               
   for ( int i = 0; i < 5; i++ )
      for ( int j = 0; j < 2; j++ )
      {
   
         cout << "a[" << i << "][" << j << "]: ";
         cout << a[i][j]<< endl;
      }

17.数组指针

*(Arryname + x)等价于Arryname[x]

注意:
C++ 中,将 char * 或 char[] 传递给 cout 进行输出,
结果会是整个字符串,如果想要获得字符串的地址(第一个字符的内存地址),
可使用以下方法:
强制转化为其他指针(非 char*);
可以是 void *,int *,float *, double * 等;

  • 使用 &s[0] 不能输出 s[0](首字符)的地址:
    因为 &s[0] 将返回 char*,对于 char*(char 指针),
    cout 会将其作为字符串来处理,向下查找字符并输出直到字符结束 *

18.常量字符串必须加const,以\0结尾

const char a4[7] = "something";//最后一位是'\0'
//直接初始化char数组是特殊的,这种初始化数组末尾字符以一个null结尾

19. vector动态向量容器

 vector<int> vec;
//可使用诸如vec.size(),vec.push_back(i)
2:
vector <int *> a 
3:
vector <int **> a 
使用数组对其赋值:
第一种:vector<int> v( a, a+sizeof(a)/sizeof(a[0]) );
第二种:
int a[]={
   1,2,3,4,5,6,7,8,9};
typedef vector<int> vec_int;
vec_int vecArray(a,a+9);

20.setw(int n)用来控制输出间隔,(n-1个空格)

cout<<setfill('*')<<setw(5)<<'a'<<endl;
输出:****a

21.动态分配数组

int MAX=10;
int *array=new int[MAX]{
   1,2,3};
delete[] array;

22.获取数组长度遍历数组:

char* x[5] = {
    (char*)"1", (char*)"2", (char*)"3", (char*)"4", "5" };
for (int i = 0; i < sizeof(x) / sizeof(char*); i++)
cout << x[i] << "\n";

23.字符串长度

cout<<strlen("123")<<endl;   //返回 3
cout<<sizeof("123"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值