重拾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
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。