目录
1.1 概念:
C++语言是一门高级编程语言,它完全兼容了C语言的语法,并且有自己的全新的语法规则。
C++语言更加适合于大型的应用软件的设计,相对而言C语言更加适合于底层业务逻辑软件设计和
数据处理软件设计,以及于硬件交互的驱动程序软件设计。
1.2 典型的C++程序结构
一个C++程序的源代码文件是以 .cpp 为结尾的。
①Linux下C++的程序结构及编译过程:
完全兼容C语言的形式
C++特定语法形式:
编译:
1.3 新的数据类型
① bool类型
1、目的:
用于存储真假值
2、取值:
true false
1 0
3、特点
该变量的大小占 1 byte 空间。
同C语言一样,非0即真。给OK赋值-199,输出的值是:1。
#include <iostream>
using namespace std;
//布尔类型变量大小:1 byte
//#if 0
int main()
{
bool ok;
cout << sizeof(ok) << endl;// "\n";
ok = true;//ok=-199;
cout << ok << endl;
return 0;
}
//#endif
② 引用类型
1、概念:
不占用内存空间,用于充当变量的别名。
2、语法格式:
初始化 : 数据类型& 变量名 = 变量 (必须初始化引用)
3、特点:
1) 引用不占内存,必须初始化
2) 引用只能初始化一次,后续不能再充当别的变量的引用
#include <iostream>
using namespace std;
//#if 0
int main()
{
int a = 100;
int b = -399;
int& pa = a;
pa = b;
cout << pa << endl;
cout << a << endl;
}
//#endif
3) 不存在多级引用
#include <iostream>
using namespace std;
//#if 0
int main()
{
int a = 100;
int b = -399;
int& pa = a;
int& paa = pa;
cout << paa << endl;
paa = 101;
cout << a << endl;
cout << sizeof(paa) << endl;
return 0;
}
int& paa = pa; 还是给 a 取别名,所以 paa 就是 a 的值:100;
给 paa 赋值 101 ,就是给 a 赋值,所以 a 的值是:101。
cout << sizeof(paa) << endl; 实质上是求 a 的大小,所以结果是:4。
4)可以给指针变量起别名
int* &paa = pa; 代表:int* 类型的pa,取别名为 paa。注意:与&取地址区分。
//给指针变量起别名
int main()
{
int a = 100;
int * pa = &a;
int* &paa = pa;
cout << pa << "," << paa << "," << &a << endl;
return 0;
}
5) 不存在引用数组
可以给一个数组起别名,
//对于数组的引用
int main()
{
int arr[] = { 1, 2, 3, 4, 5 };
int (&pArr)[5] = arr;
int i;
for (i = 0; i < 5; i++){
cout << pArr[i] << endl;
}
cout << sizeof(arr) << endl;
cout << sizeof(pArr) << endl;
return 0;
}
不允许使用引用的数组:
错误写法: int& arr[5] = { pa, pb, pc, pd, pe };
因为引用不占内存,区分不了数组中第0个元素和第1个元素,引用不占空间,都是别名。
//不存在引用数组
int main()
{
int a, b, c, d, e;
int& pa = a;
int& pb = b;
int& pc = c;
int& pd = d;
int& pe = e;
int& arr[5] = { pa, pb, pc, pd, pe };
return 0;
}
//错误代码
6) 可以对函数进行引用
函数指针:指向函数的指针变量。
格式:void(*pFun)(int) = Fun; 或如下:
int (*func_ptr)(int, int); |
存在对函数的引用:
void Fun(int x)
{
cout << "this is a function " << x << endl;
}
int main()
{
//void(*pFun)(int) = Fun;
//pFun(100);
void(&fFun)(int) = Fun;
fFun(99);
return 0;
}
7) 引用的类型和所引用的变量的类型需要完全一致
不一致会报错。
8) 不存在void类型的引用
void 泛型变量,不存在。
void* 类型指针可以接受任意类型的变量,所以 void& px = a; 不存在。
1.4 引用的特殊使用
①引用充当函数实参
实际上就是将变量本身充当了实际参数
#include<iostream>
using namespace std;
void Fun(int x, int y)
{
++x;
++y;
cout << "Fun:" << x << "," << y << endl;
}
int main()
{
int a, b;
a = 88;
b = 78;
int& pa = a;
int& pb = b;
Fun(pa, pb);//引用充当函数的实参,实际上存储的事变量本身 89 79
cout << a << "," << b << endl;
return 0;
}
②引用充当函数的形参
实际上间接修改了实际参数
形参是引用说明 x 和 y在调用时是实参的别名,对 x、y 进行操作,就是对实参进行操作。
#include<iostream>
using namespace std;
void Fun(int& x, int& y)
{
++x;
++y;
cout << "Fun:" << x << "," << y << endl;
}
int main()
{
int a, b;
a = 88;
b = 78;
//int& pa = a;
//int& pb = b;
Fun(a, b);
cout << a << "," << b << endl;
return 0;
}
③引用充当函数的返回值
返回了变量的空间本身,因此函数此时可以充当左值
#include <iostream>
using namespace std;
//函数的返回值是引用,则意味着返回了变量的空间本身,因此函数此时可以充当左值
int& Fun()
{
static int x = 899;
cout << x << endl;
return x;
}
int main()
{
//int res;
//res = Fun();
//cout << res << endl;
Fun() = 900;
Fun();
return 0;
}
1.5 作用域及可见性问题
1.5.1 作用域
① 函数原型作用域
函数声明时,形式参数变量的作用范围
② 局部作用域
函数内部以及语句块内部的变量作用范围
- 在函数内部或代码块内部声明的变量具有局部作用域。
- 它们只在声明它们的代码块内有效。
③ 全局作用域
变量能够在整个程序的任意位置使用
- 在所有函数外部声明的变量和函数具有全局作用域。
- 它们在整个程序中都是可见的,只要没有被同名局部变量覆盖。
④ 类作用域
类中声明一个成员变量或成员函数时,这些成员的名称就被限定在了该类的作用域内。
⑤ 命名空间作用域
为了解决命名危机问题,提供给用户能够自定义名称一个作用域的范围(大于局部作用域,小于全局作用域)
- 命名空间用于防止名称冲突,并控制标识符的可见性。
- 使用
namespace
关键字定义命名空间。
语法格式
namespace 命名空间名称
{
}
运算符: 作用域区分符 ::
命名空间名::变量/函数
#include <iostream>
using namespace std;//使用标准命名空间
namespace Shaanxi
{
namespace XA{
int num = 98;
void Fun()
{
std::cout << "Xian function" << std::endl;
}
}
namespace BJ
{
int num = 85;
void Fun()
{
std::cout << "Baoji function" << std::endl;
}
}
}
using namespace Shaanxi;
using Shaanxi::XA::Fun;
int main()
{
Fun();
//std::cout << XA::num << endl;
BJ::Fun();
//cout << Shaanxi::XA::num << endl;
//Shaanxi::BJ::Fun();
return 0;
}
1.5.2 可见性
C++中的可见性主要由访问修饰符(如public
、protected
、private
)和命名空间(Namespace)控制。
在指定的作用域内,一个变量或操作数能否被识别。
访问修饰符:
public
:成员在类外部可见。protected
:成员在类及其派生类中可见。private
:成员仅在类内部可见。
-
总结
- 作用域决定了标识符在代码中的有效范围。
- 可见性决定了标识符在代码中的可访问性