重拾C++ 基础知识总结(一)
1、使用gcc编译c++文件报错
proc1.cc:(.text+0x14): undefined reference to `std::cout'
C++程序使用gcc命令只能编译,不能链接库文件
应该使用g++编译
2、运行一个程序之后可以使用 echo $? 返回该程序返回值(main函数的返回值必须是一个int型的数值)
3、endl是一个特殊值,成为操纵符,将它写入输入流时,具有输出换行的效果,并刷新与设备相关联的缓冲区中。
调试过程中的输入语句都应该使用endl刷新输出流。
4、#include <iostream>
为预处理指示,标准库使用 "< >",添加自己定义的头文件时使用双引号
#include "head.h"
5、c++程序中使用的每一个名字必须在使用之前声明
6、
#include <iostream>
using namespace std;
int main(){
int temp;
int acount=0;
while(cin>>temp)
acount+=temp;
cout<<acount<<endl;
}
其中的while循环是一个死循环,当遇到文件结束符或者读到的不是一个整型数的时候就会结束循环
windows中的文件结束符是 control+z ,Linux/Unix中文件结束符是 control+d
7、一般将一个类的定义放到一个文件中(.h 头文件),要使用该类就要包含这个文件
每个类定义一个类型,类型名与类名相同
8、c++中的数据类型中,整型值short、int、long存储空间不同,一般的short为机器字长的一半,int为机器字长,long类型为一个或者两个机器字长(在32位机器中int类型和long类型通常字长是相同的,都为4个字节,long类型的数字表示2^32为-2147483648)。short、int、long默认都为带符号整数。
c++中的float类型浮点数默认保留6位有效数字,double默认保留10位有效数字
9、0开头的字面值常量表示八进制数字,0x开头表示16进制数字。定义long类型数据时应该在数值的后面加上“L”表示long类型数值
10、为了兼容C语言,c++中所有字符串字面值都有编译器自动在末尾添加一个空字符。
宽字符串:
11、c++中标识符不能包含两个连续的下划线,也不能以下划线开头后面紧跟一个大写字母
命名习惯:变量名一般用小写字母,标识符包含多个单词书写为在每个词之间添加一个下划线,或者每个内嵌的词的第一个字母都大写(驼峰式)
12、
int ival(1024); // 直接初始化
int ival = 1024; // 复制初始化
c++中的初始化分为直接初始化和复制初始化,直接初始化更灵活且更加高效。对内置类型来说,复制初始化与直接初始化是没有区别的,都是提供一个值并把这个值复制到新定义的对象中。对类类型的对象来说,有些初始化仅能使用直接初始化来完成。
内置类型变量自动初始化:函数体外定义的内置类型变量自动初始化为0,函数体内的内置类型变量不自动初始化
类类型变量初始化:通过定义一个或多个构造函数控制类对象的初始化
c++中的初始化应该理解为 “创建对象并赋值”
13、c++区分声明与定义:
变量的定义用于为变量分配内存空间,还可以为变量指定初始值,在一个程序中,变量有且仅有一个定义。通常把一个对象定义在它首次使用的地方是一个很好的办法
声明用于向程序表明变量的类型和名字。定义也是声明,当定义变量时我们声明了它的类型和名字。通过使用extern关键字声明变量名而不定义它。不定义变量的声明包括对象名、对象类型和对象类型前的extern:
extern int i; // 声明但没有定义i
int i; // 声明并定义i
extern声明并不是定义,也不分配存储空间,事实上,它只是说明变量定义在程序的其他地方。程序中变量可以声明多次,但只能定义一次。
只有当extern声明位于函数外部时,才可以含有初始化式。
14、作用域:定义在所有函数外部的名字具有全局作用域,可以在程序任何地方访问。
局部作用域在一个函数内部,函数外部不能访问局部作用域。c++中作用域可以嵌套,局部作用域变量可以屏蔽全局作用域变量
c++中还有另外两种作用域:类作用域,命名空间作用域
15、const对象默认为文件的局部变量:
在全局作用域中定义非const变量时,它在整个程序中都可以访问,我们可以把一个非const变量定义在一个文件中,假设已经做了合适的声明,就可以在另外的文件中使用这个变量:
// file_1.cpp
int counter; // 定义
// file_2.cpp
extern int counter; // 使用file_1中的counter
++conuter; // 定义在file_1中的counter自增
与其他变量不同,除非特别说明,在全局作用域声明的const变量是定义该对象的文件的局部变量,此变量只存在与那个文件中,不能被其他文件访问。通过指定const变量为extern,就可以在整个程序中访问const对象。
非const变量默认为extern,要使const变量能够在其他文件中访问,必须显示的指定为extern
16、引用就是对象的另一个名字,引用主要用作函数的形式参数
引用是一种复合类型,通过在变量名前面添加“&”符号来定义。在引用的情况下,每一种引用类型都“关联到”某一其他类型。不能定义引用类型的引用
引用必须用与该引用同类型的对象初始化:
int ival = 1024;
int &refVal = ival; // refVal引用ival
int &refVal2; // 错误,引用必须初始化
int &refVal3 = 10; // 错误,引用必须用对象初始化
不可能将引用绑定到另一个对象,初始化是指明引用指向哪个对象的唯一方法。
const引用:
const引用是指向const对象的引用:
const int ival = 1024;
const int &refVal = ival; // 对象与引用都是const
int &refVal2 = ival; // 错误,非const引用指向const对象
const引用可以初始化为不同类型的对象或者初始化为右值(字面值常量):
int i = 1024;
const &ref = 42;
const &ref2 = r+i;
const引用可以绑定到一个非const对象上,这样引用本身就是只读的,而且一直指向这个对象,但是对象的值却可以通过操作对象本身改变
#include <iostream>
using namespace std;
int main(){
int i = 1024;
const int &ref = i;
cout<<"ref="<<ref<<endl; // 1024
cout<<"i="<<i<<endl; // 1024
i = i+1;
cout<<"ref="<<ref<<endl; // 1025
cout<<"i="<<i<<endl; // 1025
}
17、typedef double wages; // 类型别名,强调使用类型的目的
18、枚举(enum):
enum open_modes {input, output, append};
默认的,第一个枚举成员赋值为0,后面的每个枚举成员赋的值比前面的大1.
enum Forms {shape = 1, sphere, cylinder, polygon }; // 显示赋值:shape = 1, sphere = 2, cylinder = 3, polygon = 4
赋值: Forms f = shape;
枚举成员可以是不唯一的
enum Points {point2d = 2, point2w, point3d = 3, point3w };
19、类类型:每个类都定义了一个接口和一个实现。接口由使用该类的代码需要执行的操作组成。实现一般包括该类所需要的数据和定义该类需要但又不供一般使用的函数。
类定义首先定义类的接口!!!*******花括号后面必须要跟一个分号******!!!
class Sales_item {
public:
// 定义Sales_item对象的操作
private:
std:string isbn;
unsigned units_sold;
double revenue;
};
定义变量与定义数据成员的区别:一般不能把类成员的初始化作为其定义的一部分,当定义数据成员时,只能指定该数据成员的名字和类型。类不是在类定义数据成员时初始化数据成员,而是通过构造函数控制初始化。
20、struct与class关键字定义类的唯一区别在于默认访问级别不一样,默认情况下struct的成员为public,而class的成员默认为private
21、c++中的头文件:
头文件为相关声明提供了一个集中存放的位置,头文件一般包含类的定义、extern变量的声明和函数的声明。
为了减少处理头文件的编译时间,有些c++的实现支持预编译头文件
头文件用于声明而不是用于定义(定义就是有存储空间分配,初始化或者不含extern关键字都视为定义)
因为头文件包含在多个源文件中,所以不应该含有变量或者函数的定义(定义只可以出现一次)
头文件不应该有定义的三个例外:头文件可以定义类、值在编译时就已知的const对象和inline函数,这些实体可以在多个源文件中定义,只要每个源文件中的定义是相同的(如果const变量不是用常量表达式初始化,那么它就不应该在头文件中定义)
22、c++预处理:
头文件中经常#include到其他头文件,预处理器用指定的头文件的内容代替每个#include
为了保证多次包含同一个头文件不会引起该头文件定义的类和对象被多次定义,就要使用与处理器定义头文件保护符,头文件保护符用于避免在已经见到头文件的情况下重新处理该头文件的内容
避免多重包含:
为了避免名字冲突,与处理器变量经常用全大写字母表示。与处理器变量有两种状态:已定义和未定义。定义预处理器变量和检测其状态所用的与处理器指示不同。#define指示接受一个名字并定义该名字为预处理器变量。#ifndef指示检测指定的预处理器变量是否为定义。如果预处理器变量未定义,那么跟在其后的所有指示都被处理,知道出现#endif。
#ifndef SALESITEM_H
#define SALESTIEM_H
// 添加Sales_item 类和相关函数(头文件中的内容)
#endif
重拾C++ 基础知识总结(一)的更多相关文章
- 重拾C++ 基础知识总结(二)
1.标准库string类型: 用户程序要使用string类型对象,必须包含相关头文件 #include <string> 字符串字面值与标准库string类型不是同一种类型,字符串字面值是 ...
- 重拾CSS基础—开篇
由来 从事软件行业一晃也5年有余,之间参与过若干个基于web的项目,所以javascript和Html基本已经相当熟悉,最近对于web前端开发比较关注,分析后发现CSS的确是自己的弱项,于是决定再加强 ...
- 重拾C语言基础知识
从实习到工作两年多的时间了,虽然感觉学到了很多知识,但是事实上却将立足之本的基础知识给忘了个精光.也许跟自己没有出去找工作有关,没有好好的将C语言的基础牢牢掌握. 从现在开始吧!好好的重温基础,做一名 ...
- 重拾Java Web应用的基础体系结构
目录 一.背景 二.Web应用 2.1 HTML 2.2 HTTP 2.3 URL 2.4 Servlet 2.4.1 编写第一个Servlet程序 2.5 JSP 2.6 容器 2.7 URL映射到 ...
- 重拾java系列一java基础(1)
前言,不知不觉,从接触java到工作至今已有两年的时间,突然感觉自己的基础知识还很薄弱,有些知识虽然知道,但是停留在表面上,没有深挖,或者实践过,感觉掌握的很肤浅,而且时间一长,就觉得忘记了,我觉得这 ...
- CSS魔法堂:重拾Border之——图片作边框
前言 当CSS3推出border-radius属性时我们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,然后又发现border-t ...
- Oracle数据库基础知识
oracle数据库plsql developer 目录(?)[-] 一 SQL基础知识 创建删除数据库 创建删除修改表 添加修改删除列 oracle cascade用法 添加删除约束主键外 ...
- java中文乱码解决之道(二)-----字符编码详解:基础知识 + ASCII + GB**
在上篇博文(java中文乱码解决之道(一)-----认识字符集)中,LZ简单介绍了主流的字符编码,对各种编码都是点到为止,以下LZ将详细阐述字符集.字符编码等基础知识和ASCII.GB的详情. 一.基 ...
- CSS魔法堂:重拾Border之——更广阔的遐想
前言 当CSS3推出border-radius属性时我们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,然后又发现border-t ...
随机推荐
- TCP/IP学习(四)TCP缓冲区大小及限制(转)
链接来自:http://blog.csdn.net/ysu108/article/details/7764461 这个问题在前面有的部分已经涉及,这里在重新总结下.主要参考UNIX网络编程. (1)数 ...
- 数据结构(Splay平衡树):HAOI2008 排名系统
[HAOI2008] 排名系统 [题目描述] 排名系统通常要应付三种请求:上传一条新的得分记录.查询某个玩家的当前排名以及返回某个区段内的排名记录.当某个玩家上传自己最新的得分记录时,他原有的得分记录 ...
- Count Primes ——LeetCode
Description: Count the number of prime numbers less than a non-negative number, n. 题目大意:给一个int,返回小于它 ...
- QT5.7.0在win10下使用visual studio 2015编译(目标平台 xp)
环境:win10+vs2015+QT5.7.0 目标:编译出能在windows xp上运行的QT 通过baidu和bing找出来的结果没有一个能成功运行,大部分都能编译成功,并完美解决“exe不是有效 ...
- Nodejs in Visual Studio Code 07.学习Oracle
1.开始 Node.js:https://nodejs.org OracleDB: https://github.com/oracle/node-oracledb/blob/master/INSTAL ...
- 约瑟夫环问题-Java数组解决
约瑟夫环问题说的是,n个人围成一圈,从第k个人开始沿着一个方向报数,报到第m个人时,第m个人出列,从紧挨着的下一个人(未出列)开始,求整个环中人的出列顺序.下面是我用java实现的解决方法. clas ...
- Uva1343-The Rotation Game-IDA*算法
原题https://uva.onlinejudge.org/external/13/1343.pdf 题意: 有个#字型的棋盘,2行2列,一共24个格. 如图:每个格子是1或2或3,一共8个1,8个2 ...
- kafka入门教程
1.Kafka独特设计在什么地方?2.Kafka如何搭建及创建topic.发送消息.消费消息?3.如何书写Kafka程序?4.数据传输的事务定义有哪三种?5.Kafka判断一个节点是否活着有哪两个条件 ...
- SCOI2014 方伯伯的OJ onlinejudge
终于用自己的方法水过去了. 本地测慢的一组要三四秒,一共要十几秒,BZOJ貌似一共只让跑6s,于是就还T着的. 一开始没看n<=1e8,想的直接splay+map(splay维护名次,map维护 ...
- 输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)
群里看到这道题,用python做了做, def find(array): v_sum = greatest = 0 for a in array: v_sum += a v_sum = 0 if v_ ...