1

extern 符表示该变量不是当前作用域定义的,用于声明。
如extern i;表示i不是当前作用域里的,是其他某个include的cpp文件里的变量。

2

int *p=0;相当于初始化p为空指针。

3

指针是对象,引用不是对象。所以可以取指针的指针或者指针的引用,但不可以取引用的指针。
指针一定要指向对象。

4

  1. const int x=1;
  2. const int *p=&x; //p为指向常量的指针
  3. int * const q=&x; //q为常量指针,即q只能指向x,不能更改为指向其他变量

没有int & const p;这种写法

5

  1. typedef int* p; //命名int*为p,即p x;等同于int *x;

const 修饰typedef的新类型名时,const优先与新类型名结合,如const p *x;表示(const p) * x,即常量

6

可以利用auto &c:s遍历字符串s中的每个元素,并且c是作为引用指向对应的元素的,可以用来遍历修改s中的某些元素,如下修改s中字母为大写。

  1. // #include <stdio.h>
  2. #include <iostream>
  3. #include <string>
  4. #include <cctype>
  5. // #include <string.h>
  6. // #include <cstring>
  7. // using std::cin;
  8. // using std::cout;
  9. using namespace std;
  10. int main()
  11. {
  12. string s="fewqfqdwqteqwghrte";
  13. for(auto &c:s)
  14. {
  15. c=toupper(c);
  16. }
  17. cout<<s;
  18. system("pause");
  19. return 0;
  20. }

7

->完全等价于先解引用再.操作,如下:

  1. int main()
  2. {
  3. string s("412343141");
  4. string *t=&s;
  5. cout<<(*t).empty();
  6. cout<<t->empty();
  7. getchar();
  8. }

之前一直以为只有是类的指针取类里的子数据才能用->符号,今天学习了

8

i++相当于int temp=i;i+=1;i=temp;三个语句,返回右值
++i只有自增一步,并且返回左值

9

a&(-a)截取a的二进制位最后一位为1的数字,如a=10100,a&(-a)等于00100
a&(a-1)删除a的为1的最右侧位。

10

顶层const即变量本身为常量,底层const是变量(指针、引用)指向的是常量。

11

int转string std::to_string,该函数不光可以转整数,所有无符号、long、long long、单双精度浮点数都可以。

string转int stoi()
char * 转int atoi()

另外可以用sprintf将多个元素用指定的格式写入字符串(和printf函数类似,只是后者写到屏幕,前者写入字符串),返回写入的字符数
eg:

  1. int main()
  2. {
  3. char s[14];
  4. cout<<sprintf(s,"%d,%.1f",1,2.5)<<endl;
  5. cout<<s;
  6. getchar();
  7. return 0;
  8. }

输出:

同理sscanf可以将某字符串内容以指定格式分割写入多个变量
一篇讲sscanf的博客

还可以用stringstream,这个比较慢一般不用。
eg:

  1. int main()
  2. {
  3. stringstream ss;
  4. string s;
  5. ss<<124;
  6. ss>>s;
  7. cout<<s;
  8. getchar();
  9. return 0;
  10. }

12

explicit用来防止类的构造函数的隐式转换。
例子如下:
新一点的c++如vs2019里不用编译就会报错。

  1. class Test1
  2. {
  3. public:
  4. Test1(int n)
  5. {
  6. num=n;
  7. }//普通构造函数
  8. private:
  9. int num;
  10. };
  11. class Test2
  12. {
  13. public:
  14. explicit Test2(int n)
  15. {
  16. num=n;
  17. }//explicit(显式)构造函数
  18. private:
  19. int num;
  20. };
  21. int main()
  22. {
  23. Test1 t1='a';//隐式调用其默认拷贝构造函数,成功
  24. Test2 t2=12;//编译错误,不能隐式调用其构造函数
  25. Test2 t2(12);//显式调用成功
  26. return 0;
  27. }

13

static修饰局部变量生成局部静态对象。在第一次经过时初始化,之后一直存留在全局变量区。即在函数中第一次遇到该语句,初始化整个变量,但依然还是局部变量(其他函数中不可见),但若再次进入当前函数,不再执行初始化语句,而是直接使用之前保存好的值。

  1. #include <stdio.h>
  2. void test()
  3. {
  4. static int num = 0;
  5. num++;
  6. printf("%d ", num);
  7. }
  8. int main()
  9. {
  10. int i = 0;
  11. for (i = 0; i < 10; i++)
  12. {
  13. test();
  14. }
  15. return 0;
  16. }

14

initializer_list可以传入不定个形参,但一定是同一类型的,类型要指定好,如下面这样。

  1. int f(initializer_list<int> p)
  2. {
  3. for (auto x : p)
  4. {
  5. cout << x << endl;
  6. }
  7. return 0;
  8. }

15

inline函数(内联函数)是为了替换宏函数来的,更加安全。inline关键字应该在函数定义的时候加,声明的时候加inline是没有用的。

关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。

16

class、struct占用的空间一定是成员变量最大类型长度的整数倍(数据对齐)
如下面:
A类a占0号字节,空一格,b占2~3,c占4 ~7,d占8 ~15,总占用0 ~15,16个字节。
B类b占0 ~3,空四格4 ~7(四个字节),a占8 ~15,c16 ~17,d18,目前总长度19,但B中最大变量double长度8个字节,而82=16,83=24,故还要填24-19=5个字节。

17

C++容器的size函数返回的都是size_t类型,这个类型是unsigned int,简单的int siz=s.size()。比如在for循环里这样写:

  1. for(int i=0;i<s.size()-1;++i)
  2. {

当s为空时,s.size()-1的值为ffffffff,表示4294967295,而不是我们想要的-1。
这种情况for会进入循环,这不是我们想要的。
所以解决办法:为空提前单独判断

18


一篇讲类静态成员的博客

C++记录(一)的更多相关文章

  1. 记一次debug记录:Uncaught SyntaxError: Unexpected token ILLEGAL

    在使用FIS3搭建项目的时候,遇到了一些问题,这里记录下. 这里是发布搭建代码: // 代码发布时 fis.media('qa') .match('*.{js,css,png}', { useHash ...

  2. nginx配置反向代理或跳转出现400问题处理记录

    午休完上班后,同事说测试站点访问接口出现400 Bad Request  Request Header Or Cookie Too Large提示,心想还好是测试服务器出现问题,影响不大,不过也赶紧上 ...

  3. Kali对wifi的破解记录

    好记性不如烂笔头,记录一下. 我是在淘宝买的拓实N87,Kali可以识别,还行. 操作系统:Kali 开始吧. 查看一下网卡的接口.命令如下 airmon-ng 可以看出接口名称是wlan0mon. ...

  4. 2015 西雅图微软总部MVP峰会记录

    2015 西雅图微软总部MVP峰会记录 今年决定参加微软MVP全球峰会,在出发之前本人就已经写这篇博客,希望将本次会议原汁原味奉献给大家 因为这次是本人第一次写会议记录,写得不好的地方希望各位园友见谅 ...

  5. 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)

    分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...

  6. 我是如何在SQLServer中处理每天四亿三千万记录的

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

  7. 前端学HTTP之日志记录

    前面的话 几乎所有的服务器和代理都会记录下它们所处理的HTTP事务摘要.这么做出于一系列的原因:跟踪使用情况.安全性.计费.错误检测等等.本文将谥介绍日志记录 记录内容 大多数情况下,日志的记录出于两 ...

  8. ASP.NET Core应用中如何记录和查看日志

    日志记录不仅对于我们开发的应用,还是对于ASP.NET Core框架功能都是一项非常重要的功能特性.我们知道ASP.NET Core使用的是一个极具扩展性的日志系统,该系统由Logger.Logger ...

  9. python+uwsgi导致redis无法长链接引起性能下降问题记录

    今天在部署python代码到预生产环境时,web站老是出现redis链接未初始化,无法连接到服务的提示,比对了一下开发环境与测试环境代码,完全一致,然后就是查看各种日志,排查了半天也没有查明是什么原因 ...

  10. 记录我这一年的技术之路(nodejs纯干货)

    2015年12月28日23:19:54 更新koa应用.学习型网站和开发者工具等 coding伊始 开始认认真真的学习技术还是2015.10.21日开始的,记得很清楚,那天,是我在龙湖正式学习的第一天 ...

随机推荐

  1. 更新了svn 后,某个文件多了几个副本如:xxx.r1 xxx.r3 xxx.mine等,正常文件名xxx

    分析:更新了svn后 原因: 是的,修改完后,还要把问号文件全部删除,再重新提交(话说,你的SVN名字和我的名字一样,wk).你每次修改之前都更新一下最好了.

  2. C++记录(二)

    1.算术移位和逻辑移位. 逻辑移位是只补0,算术移位是看符号,负数补1,正数补0(讨论的是右移的情况下). 负数左移右边一样补0.如果遇到位运算的相关题目需要对int变量进行左移而且不知道正负,那么先 ...

  3. C语言sprintf函数的深入理解

    由于sprintf跟printf在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出.这也导致sprintf比printf有用得多.所以本文着重介绍sprintf, ...

  4. SequoiaDB 巨杉数据库Docker镜像使用教程

    为方便用户快速体验,SequoiaDB 巨杉数据库提供基于 Docker 的镜像.本文介绍如何在 Docker 环境下部署 SequoiaDB 分布式集群环境.   集群规划 我们准备在五个容器中部署 ...

  5. not under version control

    表示这个文件没有在SVN的控制之下 你在执行commit操作的时候,只有处于SVN控制之下的文件才能被commit,从update得到的文件是在SVN控制之下的(比如原来就存在的文本文件,你可以对其修 ...

  6. TD - 多选框 - CheckBox

    模板 模板1:TD //Html - checked="true" 默认选中 <input dojoType="bootstrap.form.CheckBox&qu ...

  7. (转)GC ROOTS

    还是英文的技术博客更给力,更清楚,本人懒,没有翻译. In your specific example, in any managed environment, Person is not a GC ...

  8. Python记:静夜偶记

  9. MySQL加号+ 的作用

    案例:查询员工名和员工姓,连接成一个字段,并显示为: 姓名 SELECT last_name+first_name AS 姓名 FROM employees;没有报错但姓名一下全是0 Java中的 + ...

  10. 在虚拟机中使用Git

    自己如何从安装虚拟机到使用git进行项目代码版本管理的部分教程因为是自学所以没有好的教程只能自己进行百度,网上的教程太多了但都是只是一个模块没有从头到尾详细的教程,我们如果有个详细的教程本来只需花很少 ...