C++复健笔记

C++复健笔记

string用法

一、初始化
初始化有两种方式,其中使用等号的是拷贝初始化,不使用等号的是直接初始化。

string str1 = "hello world";      // str1 = "hello world"
string str2("hello world");       // str2 = "hello world"

值得一提的是,如果:

string str13 = string("hello world",5)      // str13 = "hello"  而非  " world"

此时,"hello world"应看作字符数组(参见str11),而非string对象(参见str7)

size_t

首先,我非常肯定以及确定的告诉你ssize_t是有符号整型,在32位机器上等同与int,在64位机器上等同与long int,有没有注意到,它和long数据类型有啥区别?其实就是一样的。size_t 就是无符号型的ssize_t,也就是unsigned long/ unsigned int (在32位下),不同的编译器或系统可能会有区别,主要是因为在32位机器上int和long是一样的。在64位没有测试,但是参见百度百科,size_t 在64位下是64位,那么size_t的正确定义应该是typedef unsigned long size_t。

size_t 是一些C/C++标准在stddef.h中定义的,size_t 类型表示C中任何对象所能达到的最大长度,它是无符号整数。

它是为了方便系统之间的移植而定义的,不同的系统上,定义size_t 可能不一样。size_t在32位系统上定义为 unsigned int,也就是32位无符号整型。在64位系统上定义为 unsigned long ,也就是64位无符号整形。size_t 的目的是提供一种可移植的方法来声明与系统中可寻址的内存区域一致的长度。

ssize_t是什么类型的?
解释一:为了增强程序的可移植性,便有了size_t,它是为了方便系统之间的移植而定义的,不同的系统上,定义size_t可能不一样。
在32位系统上 定义为 unsigned int 也就是说在32位系统上是32位无符号整形。在64位系统上定义为 unsigned long 也就是说在64位系统上是64位无符号整形。
size_t一般用来表示一种计数,比如有多少东西被拷贝等。例如:sizeof操作符的结果类型是size_t,该类型保证能容纳实现所建立的最大对象的字节大小。 它的意义大致是“适于计量内存中可容纳的数据项目个数的无符号整数类型”。所以,它在数组下标和内存管理函数之类的地方广泛使用。而ssize_t这个数据类型用来表示可以被执行读写操作的数据块的大小.它和size_t类似,但必需是signed.意即:它表示的是signed size_t类型的。
typedef unsigned long size_t

解释二:ssize_t是signed size_t,
size_t是标准C库中定义的,应为unsigned int。定义为typedef int ssize_t。
而ssize_t:这个数据类型用来表示可以被执行读写操作的数据块的大小.它和size_t类似,但必需是signed.意即:它表示的是sign size_t类型的。

https://blog.csdn.net/lplp90908/article/details/50405899

C++中函数后面加const

uint64_t next_delivery_time( void ) const;

在函数后加const的意义:
我们定义的类的成员函数 中,常常有一些成员函数不改变类的数据成员,也就是说,这些函数是"只读"函数,而有一些函数要修改类数据成员的值。如果把不改变数据成员的函数都加上const关键字进行标识,显然,可提高程序的可读性。其实,它还能提高程序的可靠性,已定义成const的成员函数,一旦企图修改数据成员的值,则编译器按错误处理。 const成员函数和const对象 实际上,const成员函数还有另外一项作用,即常量对象相关。对于内置的数据类型,我们可以定义它们的常量,用户自定义的类也一样,可以定义它们的常量对象。
  
1、非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误)
2、表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中,
任意修改它所在的类的成员的操作都是不允许的(因为隐含了对this指针的const引用);
3、唯一的例外是对于mutable修饰的成员。
加了const的成员函数可以被非const对象和const对象调用
但不加const的成员函数只能被非const对象调用

char getData() const{undefined
return this->letter;

}

c++ 函数前面和后面 使用const 的作用:
前面使用const 表示返回值为const

后面加 const表示函数不可以修改class的成员
————————————————
版权声明:本文为CSDN博主「DaMercy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/DaMercy/article/details/109098694

emplace_back()和push_back()的区别

场景一:考虑是否原地构造

push_back():向容器中加入一个右值元素(临时对象)时,首先会调用构造函数构造这个临时对象,然后需要调用拷贝构造函数将这个临时对象放入容器中。原来的临时变量释放。这样造成的问题就是临时变量申请资源的浪费。

emplace_back():引入了右值引用,转移构造函数,在插入的时候直接构造,只需要构造一次即可。

也就是说,两者的底层实现的机制不同。push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素);而 emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。

C++ 11新标准中引入了三个新成员——emplace_front、emplace和emplace_back,这些操作构造而不是拷贝元素。这些操作分别对应push_front、insert和push_back,允许我们将元素放置在容器头部、一个指定位置之前或容器尾部。

析构函数 ~

析构函数也是一种特殊的成员函数。它执行与构造函数相反的操作,通常用于撤消对象时的一些清理任务,如释放分配给对象的内存空间等。

同样的,我们来看看析构函数的几个特点:

函数名是在类名前加上~,无参数且无返回值。
一个类只能有且有一个析构函数,如果没有显式的定义,系统会生成一个缺省的析构函数(合成析构函数)。
因为无参数无返回值析构函数不能重载。每有一次构造函数的调用就会有一次析构函数的调用。
当撤消对象时,编译系统会自动地调用析构函数。 如果程序员没有定义析构函数,系统将自动生成和调用一个默认析构函数,默认析构函数只能释放对象的数据成员所占用的空间,但不包括堆内存空间。
————————————————
版权声明:本文为CSDN博主「King逍灬遥」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/king13059595870/article/details/101191992

初始化列表

与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段。

class foo
{
public:
foo(string s, int i):name(s), id(i){} ; // 初始化列表
private:
string name ;int id ;
};

从概念上来讲,构造函数的执行可以分成两个阶段,初始化阶段和计算阶段,初始化阶段先于计算阶段.

初始化阶段
所有类类型(class type)的成员都会在初始化阶段初始化,即使该成员没有出现在构造函数的初始化列表中.

计算阶段
一般用于执行构造函数体内的赋值操作。
————————————————
版权声明:本文为CSDN博主「小C博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lws123253/article/details/80368047

template<typename... Args>

除了sizeof...以外,...的功能就是展开...之前的token。

template <typename...> 表示这个里面有0或多个typename。同理也有template <int...>。

template <typename... Args>只是给这个parameter pack(0个或多个typename)取了个名字叫Args,

作者:Starve Jokes
链接:https://www.zhihu.com/question/449483418/answer/1782523181
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

template

声明类模板时要增加一行
template <class 类型参数名>
template意思是“模板”,是声明类模板时必须写的关键字。在template后面的尖括号内的内容为模板的参数表列,关键字class表示其后面的是类型参数。在本例中numtype就是一个类型参数名。这个名宇是可以任意取的,只要是合法的标识符即可。这里取numtype只是表示“数据类型”的意思而已。此时,mimtype并不是一个已存在的实际类型名,它只是一个虚拟类型参数名。在以后将被一个实际的类型名取代。
————————————————
版权声明:本文为CSDN博主「AUTO1993」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/AUTO1993/article/details/78649473

argc、argv的具体含义

​ argc和argv参数在用命令行编译程序时有用。main( int argc, char* argv[], char env ) 中
​ 第一个参数,int型的argc,为整型,用来统计程序运行时发送给main函数的命令行参数的个数,在VS中默认值为1。
​ 第二个参数,char*型的argv[],为字符串数组,用来存放指向的字符串参数的指针数组,每一个元素指向一个参数。各成员含义如下:
​ argv[0]指向程序运行的全路径名
​ argv[1]指向在DOS命令行中执行程序名后的第一个字符串
​ argv[2]指向执行程序名后的第二个字符串
​ argv[3]指向执行程序名后的第三个字符串
​ argv[argc]为NULL
​ 第三个参数,char
型的env,为字符串数组。env[]的每一个元素都包含ENVVAR=value形式的字符串,其中ENVVAR为环境变量,value为其对应的值。平时使用到的比较少。

mahimahi中argv[ 0 ] 为 mm-delay等(argv[0]指向程序运行的全路径名 )

#include <stdio.h>
using namespace std;

int main(int argc, char ** argv)
{
    int i;
    for (i = 0; i < argc; i++)
        printf("Argument %d is %s\n", i, argv[i]);
    return 0;
}

测试图片描述

图1.xxx.jpg

https://blog.csdn.net/dgreh/article/details/80985928

命令行解析参数之getopt_long函数

https://blog.csdn.net/qq_33850438/article/details/80172275

参数-和--的区别

原文地址:http://blog.csdn.net/seekkevin/article/details/49909617

第一种:参数用-的说明后面的参数是字符形式(Unix 风格)。
第二种:参数用--的说明后面的参数是单词形式(GNU 风格)。
第三种:参数前有横的是 System V风格。
第四种:参数前没有横的是 BSD风格。

有关System V和BSD的其他区别:

系统启动过程中 kernel 最后一步调用的是 init 程序,init 程序的执行有两种风格,即 System V 和 BSD。
System V 风格中 init 调用 /etc/inittab,
BSD 风格调用 /etc/rc,它们的目的相同,都是根据 runlevel 执行一系列的程序。

# uint8_t / uint16_t / uint32_t / uint64_t 到底是什么

方便代码维护,涉及跨平台,不同得平台有不同的字长。

如:

​ 在C中没有bool型,于是在一个软件中,一个程序员使用int,一个程序员使用short,会比较混乱,最好用一个typedef来定义一个统一的bool,每个程序员都可以用这个别名的bool。

涉及到跨平台,不同的平台会有不同的字长,所以利用预编译和typedef可以让你最有效的维护你的代码

1 .uint8_t / uint16_t / uint32_t / uint64_t 是什么

​ 答:是使用typedef给类型起得别名。

  1. uint8_t / uint16_t / uint32_t / uint64_t 占用几个字节

​ 答: 1字节 uint8_t

​ 2字节 uint16_t

​ 4字节 uint32_t

​ 8字节 uint64_t

\3. 这些类型在哪里定义

C99标准的C语言硬件为我们定义了这些类型。 按照posix标准,一般整形对应的*_t类型,

具体定义在:/usr/include/stdint.h ISO C99: 7.18 Integer types <stdint.h>

https://blog.csdn.net/kiddy19850221/article/details/6655066

https://www.jianshu.com/p/3bbfbebc56e1

# std

std::是个namespace标识符,要使用 标准库中的函数或者对象 都要用std来限定。

至于为什么将cout放到名字空间std中,是因为象cout这样的对象在实际操作中或许会有好多个,比如说你自己也可能会不小心定义一个对象叫cout,那么这两个cout对象就会产生冲突。

那么std都是在什么时候使用?

一般来说,std都是要调用C++标准库时使用。比如:

使用标准库文件iostream时,要写上std;

使用非标准库文件iostream.h,不用写。

如图引入非标准库iostream.h时,省去了std:😗*

img

图2.xxx.jpg

当然使用标准库时,也是可以省略的,不过需要进行处理

1.分别将cout和endl释放出来

img

图2.xxx.jpg

2. 将命名空间释放出来

注:using namespace std 告诉编辑器我们将要使用名字空间std中的函数或者对象,所以cout和endl前面不用注明他们是std这个名字空间中的cout和endl

img

(36条消息) C++中std是什么意思?_PGzxc的专栏-CSDN博客_stl是什么意思

# * 相当于一个魔杖,变量拿着它就能指向某个地址并 获得和操纵其值

# 在进行函数调用时,使用 & 来修饰实参,表示是将该变量的地址作为参数传入函数。

# 指针传递和引用传递

指针传递:形参 加*,实参加&。

引用传递:形参加& (alias 别名的意思)

(36条消息) C++函数参数中&和的意义_邹亮的博客-CSDN博客_c语言函数中参数定义时和&什么意思

# undefined reference to `std::cout'等错误

(1)gcc和g++都是GNU(组织)的一个编译器。

(2)后缀名为.c的程序和.cpp的程序g++都会当成是c++的源程序来处理。而gcc不然,gcc会把.c的程序处理成c程序。

(3)对于.cpp的程序,编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++。

# 编译运行c++文件

⚠️ cpp文件用g++ c文件用gcc

g++ test.cpp

./a.out

-o: 修改生成文件的名字,如果不修改的话名字在Unix下面是a.out,Windows下面是a.exe的可执行文件名字,实在有点难听。用这个参数可以修改默认的名字。

在这里插入图片描述

在这里插入图片描述

(36条消息) C++语言 如何用G++进行编译和运行程序_xuanweiace的博客-CSDN博客_g++编译后怎么运行

# .h和.c文件解析

C语言中.h和.c文件解析(很精彩) - n哖苡逅 - 博客园 (cnblogs.com)

# c++ 函数后面加一个冒号的含义

冒号后面跟的是赋值,这种写法是C++的特性。
A( int aa, int bb ):a(aa),b(bb)
{
}
相当于
A( int aa, int bb )
{
a=aa;
b=bb;
}
posted @ 2022-04-27 11:31  Leventseleveil  阅读(116)  评论(0编辑  收藏  举报