应部门领导要求,需要带两位同事学习C++,特准备下,将基础知识罗列了下,正好借此机会将基础知识再回顾下。
1、C++的输入和输出:
(1)使用cin and cout来进行输入和输出,对应头文件为#include
(2)using namespace std ->指定命名空间std,如果没有这个语句,cout就会没有定义,除非写明std::cout,指明其来自命名空间std.
(3)数据类型包括:
1)整型:int /long (4 bytes)
2)字符型:char(1 byte)、wchar_t (2 bytes)
3)布尔型:bool (1 byte)
4)浮点型:float(4 bytes)/ double (8 bytes)
5)指针:指针字节长度计算原理其实跟int差不多,一个指针的位数和编译系统的位数是相等的,即32位系统应该是4个字节,64位系统应该是8个字节。
每种数据类型所占的内存大小用sizeof()表示
2、引用类型:
(1)类型名 &引用名 = 同类型的某变量名;
如:int n; int &r=n;
(2) 定义引用时一定要将其初始化,否则编译无法通过,引用只能引用变量。
代码示例如下:
#include <iostream>
using namespace std;
int main(){
int n = 5;
char c = 'a';
float f = 3.5;
double d = 3.94;
bool flg = true;
int *ptr = &n;
//1.cin cout
int ss;
cout << "请输入ss的值:";
cin >> ss;
cout << "ss=" << ss << endl;
cout << "n=" <<n<< endl;
cout << "c=" << c << ",f=" << f <<",d= "<<d<<",flg="<<flg<< endl; //endl表示换行
cout << "int所占内存=" << sizeof(n) <<endl;
cout << "char所占内存=" << sizeof(c) << endl;
cout << "float所占内存=" << sizeof(f) << endl;
cout << "double所占内存=" << sizeof(d) << endl;
cout << "bool所占内存=" << sizeof(flg) << endl;
cout << "Ptr所占内存=" << sizeof(ptr) << endl;
//2.引用
int n2=4;
int & r12 = n2; //r12引用了n2,r12是n2的别名
r12 = 5; //修改r12就是修改n2
cout << r12 << endl; //输出5
cout << n2 << endl; //输出5
n2 = 6; //修改n2就是修改r12
cout << n2 << endl; //输出 6
int & r22 = r12; //r12和r22引用同一个变量,就是n2
cout << r22 << endl; //输出 6
return 0;
}
运行结果如下:
(3)引用作为函数的返回值类型:
其中,常引用:不能通过常引用去修改引用的内容。下面的代码有所体现。
#include <iostream>
using namespace std;
int n = 4;
int & SetValue()
{
return n; //返回对n的引用
}
int main()
{
//1.引用作为函数的返回类型
SetValue() = 8; //返回值是引用的函数调用表达式,可以作为左值使用
cout << n << endl; //8
int & r = SetValue();
cout << r << endl; //8
//常引用
int n1 = 100;
const int & r1 = n1;
//r1 = 200; //编译出错,不能通过常引用修改其引用的内容
n1 = 300; //没问题,n1的值变为300
cout << n1 << endl;
cout << r1 << endl;
return 0;
}
运行结果如下:
(4)C++中函数的传递方式分为两种:传值和传引用。在函数的形参不是引用的情况下,参数传递是传值的。传引用的当时要求函数的形参是引用。
示例代码:
#include <iostream>
using namespace std;
//参数传值
void Swap1(int a, int b)
{
int tmp;
//以下三行将a、b值互换
tmp = a;
a = b;
b = tmp;
cout << "In Swap1: a = " << a << " b = " << b << endl;
}
//参数传引用
void Swap2(int &a, int &b)
{
int tmp;
//以下三行将a、b值互换
tmp = a;
a = b;
b = tmp;
cout << "In Swap2: a = " << a << " b = " << b << endl;
}
int main()
{
int a1 = 4, b1 = 5;
Swap1(a1, b1);
cout << "After swaping: a1 = " << a1 << " b1 = " << b1 << endl;
int a2 = 6, b2 = 7;
Swap2(a2, b2);
cout << "After swaping: a2 = " << a2 << " b2 = " << b2 << endl;
return 0;
}
运行结果:
3、内联函数(inline)
关键字:inline, 将函数定义为内联函数,其目的就是提高函数的执行效率,将inline放在函数定义(定义而非声明,即和函数体绑定在一起)的前面即可将函数指定为inline 函数。
inline int max(int a, int b)
{
return a > b ? a : b;
}
程序执行时调用: cout<<max(a, b)<<endl;在编译时展开为cout<<(a > b ? a : b)<<endl;
4、函数重载
(1)C++不允许变量重名,但是允许多个函数去形同的名字,只要参数列表不同即可,称为函数的重载(overload),即函数名相同,参数列表不同。好处就是可以减少函数名的数量,避免名字空间的污染,增加程序的可读性。
示例代码:
#include<iostream>
#include<string>
using namespace std;
void print(int i)
{
cout << "Print an integer: " << i << endl;
}
void print(string str)
{
cout << "Print a string: " << str << endl;
}
void print(double d)
{
cout << "Print a double: " << d << endl;
}
int main()
{
//函数重载
print(10);
print("Hello World!");
print(3.14);
return 0;
}
运行结果:
(2)Ubuntu下看函数重载的编译机理:
g++ -g -W demo.cpp
-g : 添加调试信息
-W : 提供比较严格的告警与错误信息
例如:cpp 文件:overload.cpp:
执行命令:
1)g++ -g -W overload.cpp -> 可生成默认名为a.out
2)./a.out ->可编译运行程序,输出程序结果
3)objdump -d a.out >log.txt 反汇编并将结果重定向到log.txt文件中,然后分析log.txt
4)vi log.txt
分析log.txt文件可得:代码中的void print(int i) 在符号表中生成对应的函数名为_Z5printi,,如下所示:
函数void print(string str)在符号表中生成的函数名为:_Z5printNS
函数重载的编译机理:C语言不支持函数重载,C++支持函数重载,C++在编译重载函数时,重载函数生成的符号表中的名称不一样,因此编译可以通过。
5、动态分配和释放内存
C++中的数组长度是预先定义好的,不允许定义元素个数不确定的数组。如:
int n;
int a[n]; //这种定义是不允许的
有时候在实际的编程中处理的数据量并不确定,因此引入动态分配内存。
(1)静态创建数组(直接定义创建)
如:int a[]={1,2,3,4,5,6};
(2)动态创建数组
T *p =new T[N];
int *p=new int[100]; //动态创建一维数组
Delete[] p;
//动态创建二维数组p[m][n]
int **p=new int *[m];
for(int i=0;i<m;i++)
{
p[i]=new int[n];
}
//动态释放二维数组:
for(int i=0;i<m;i++)
{
delete [] p[i];
}
delete [] p
6、C++字符串
string并不是C++中的基本数据类型,而是标准模板库中的一个类。
如string str; str表示一个类对象。要使用string对象,必须包含头文件 #include
如:string str=“Hello World”;
参考链接:http://c.biancheng.net/cplus/c2cpp/