C++编程基础
C++ 于1982年左右诞生于美国贝尔实验室。
C++:C Plus Plus,一门支持面向对象编程的高级语言。C++ 直接继承了C语言的几乎所有语法特性,并在此基础上新增了面向对象编程机制,比如类、对象、继承、多态等,还有一些对大型复杂软件项目开发有意义的语法特性,比如引用、重载、模板、RTTI、异常处理等。
C++ 程序运行效率略低于 C语言,但开发效率远高于 C 语言。
C++ 学习方法:C语言学会了就相当于已经学会了 C++ 大部分内容(85%),只需再学习一下 C++ 新增的内容即可完全掌握 C++,尤其是面向对象编程这块内容。
C++ 源文件的后缀名通常为 .cpp 或 .cc。
Linux平台常用:C++ 编译器:g++ 和 gcc。
sudo apt install -y g++
C++风格的头文件名称通常不带任何后缀名,C++标准库中的头文件全部如此。当然,C++编译器也支持 C 风格的的头文件。
基本数据类型
C++ 新增布尔类型(bool)和引用类型。
bool:占 1 Byte,对应两个字面量(常量):true 和 false。
引用类型(Reference):一种特殊的数据类型,相当于指针的包装,可以认为就是一个变量的别名,在大多数场合可以取代指针。
常引用(const reference)。
引用可以作为函数形参,实现引用传递的效果。如果函数内部无需改变指向的数据,请使用引用作为形参。
运算符
c++新增运算符:
- new:用于在堆区中申请空间
- delete:用于释放 new 申请的堆区空间
- :::作用域运算符
注意:new/delete 运算符和malloc/free 函数虽功能一样,但内部实现细节有所不同,所以不能混用。
命名空间(Namespace)
解决变量、函数、类型等命名冲突的问题,因为来自不同命名空间中的这些名字可以相同。
全局命名空间
使用 namespace 关键字可以自定义命名空间
使用 using namespace 声明默认命名空间,尽量少用!
实例1(数据类型、运算符):
#include <iostream> //包含 iostream 头文件
#include <cstdio> //等效 #include <stdio.h>
#include <cstdlib>
#include <string> //string类
using namespace std; //使用 std 命令空间作为默认命名空间
struct Student{
int sno;
string name;
float sight;
};
void my_swap(double& ,double& );
void set_stu(Student& );
int main()
{
/*
//布尔类型
bool a = true;
a = false;
//cout << a << "1223"<< "dad" <<endl;
cout << "1";
*/
/*
//引用
int i = 3;
//引用在声明时必须初始化,后续无法改变引用关系
int& j = i; //定义一个 int 引用 j,它指向变量 i,相当于 i 的别名,i、j代表同一块地址空间的内容
j++;
cout << i <<endl;
cout << j <<endl;
*/
/*
//mallpc/free 写法
double& d = *(double*)malloc(sizeof(double));
d = 3.1467;
cout << d << endl;
free(&d);
*/
/*
//new/delete 写法
double* p = new double;
double& d = *p;
d = 3.14;
cout << *p << endl;//d
delete &d;//p
*/
/*
//数组使用堆区
int* nums = new int[10];
nums[1] = 3;
nums[2] = 9;
cout << nums[2] <<endl;
delete[] nums; //**千万不要漏写中括号,否则会造成内存泄漏**//
*/
/*
//常引用
int i = 3;
const int* p = &i;
const int& j = i; //定义常引用,不能通过 j 改变空间的值(只读)
int const& m = i;
// *p = 5; //错误
// j = 5; //错误
i = 5; //正确
cout << m <<endl;
*/
/*
//错误做法:常量不能作为非常量引用的右值
const int i = 3;
int& j = i; //错误
cout << j <<endl;
*/
/*
//引用传参
double d1,d2;
cin >> d1 >> d2; //输入两个值
my_swap(d1,d2);
cout << d1 << " "<< d2 <<endl;
*/
/*
Student s1,s2;
s1.name = "小王";
s1.sno = 1001;
s1.sight = 5.1F;
cout << sizeof(s1) <<endl;
cout << s1.sno << s1.name << s1.sight <<endl;
s2.sno = 1003;
set_stu(s2);
cout << s2.sno << s2.name << s2.sight <<endl;
*/
int a[3] = {2, 3, 4};
int (&c)[3] = a; //引用的数组
c[0] = 9;
int *p = &a[2];
p[-2]++;
cout << p[-2] << endl;
return 0;
}
void my_swap(double& a,double& b)
{
double tmp =a;
a = b;
b = tmp;
}
void set_stu(Student& s)
{
if(s.sno = 1003)
{
s.name = "琛翀";
s.sight = 6.6;
}
}
实例2(名字空间):
#include <iostream>
using namespace std;
int g = 3;
//声明一个命名空间nn
namespace nn{
int g = 99999;
}
int main()
{
int g = 4;
std::cout << ::g <<std::endl;
//访问来自全局命名空间中的变量 g
cout << ::g <<endl;
//nn::g;
std::cout << nn::g <<endl;
return 0;
}