C++开始
1.命名空间
C语言问题之一命名冲突,当写较大程序时,给程序命名是一个很麻烦的事情,比较很多人可能命名会用命名一块等等。C++之父当然也为此苦恼,于是创造出了命名空间这一概念。
命名空间即引入一个名为namespace命名空间域,就是给你的程序独立开辟出一块空间来存放你写的程序这样就不用担心你们写程序的时候命名重复。
列:
::域作用限定符
rand 默认全局域
bit::sent 即为在名为bit这个区域中的sent
using namespace bit;//展开名为bit的命名空间域
using bit :: x;//指定展开bit命名空间域中的x
//前两种方法比较方便适合大面积使用的时候使用
cout<<bit::y<<endl;//在使用中单独展开y
//适合小范围使用
//C++中的命名空间域适合嵌套使用
namespace bit
{
namespace biq
{
int x;
}
}
void main()
{
bit::biq::x;
}
using namespace std;
//官方的命名空间域,如流插入,流提取等众多函数都在此域当中,使程序员使用最广泛的一个命名空间域
编译器编译时默认查找的顺序为:当前的局部域->全局域,正常是不会在命名空间中寻找到,需要自己编入。C++中的域有:局部域,全局域,命名空间域,类域(其中后两个不影响生命周期)。
2.输入输出
C++中常用的库为iostream。iostream库中包含两个基础类型istream,ostream,分别表示输入流,输出流。
标准输入输出对象
标准库定义了4个IO对象。为了处理输入,我们使用一个名为cin(发音为see-in)的istream类型的对象。这个对象也被称为标准输入(standard input)。对于输出,我们使用一个名为cout(发音为see-out)的ostream 类型的对象。此对象也被称为标准输出(standard output)。标准库还定义了其他两个ostream对象,名为cerz和clog(发音分别为see-err和see-log)。我们通常用 cerr来输出警告和错误消息,因此它也被称为标准错误(standarderror)。而clog用来输出程序运行时的一般性信息。系统通常将程序所运行的窗口与这些对象关联起来。因此,当我们读取cin,数据将从程序正在运行的窗口读入,当我们向coutcerr和clog写入数据时,将会写到同一个窗口
#include<iostream>
int main()
{
std::cout << "Enter two numbers" << std::endl;
int v1 = 0,int v2 = 0;
std::cin >> v1 >> V2;
std::cout << v1+v2 << std::endl;
return 0;
}
//其中endl相当于C语言中的‘\n’,即为换行符
3.缺省参数
在 C++ 中,缺省参数是指在函数声明或定义时为参数指定一个默认值。当调用函数时,如果没有为带有缺省值的参数提供实参,则该参数将使用默认值。
#include <iostream>
void printMessage(const char* message = "Hello, World!") {
std::cout << message << std::endl;
}
int main() {
printMessage(); // 使用默认参数值输出 "Hello, World!"
printMessage("Hi!"); // 输出 "Hi!"
return 0;
}
如果觉得上面那个不好理解,便再举一个简单点的例子。
void Func(int a = 1)
{
cout << a << endl;
}
int main()
{
Func(2);//在此调用函数时输出为2
Func();//在此调用函数时输出为1
return 0;
}
缺省传参时需要传多个参数时,要按顺序传参,不能中间跳着隔断传。且声明定义的时候缺省在声明的时候进行。
4.函数重载
在 C++ 中,函数重载(function overloading)是指在同一个作用域内,可以有一组具有相同函数名,不同参数列表的函数。函数重载允许使用相同的函数名来执行相似但不同的操作,具体取决于传入的参数类型和数量。(函数重载不看函数的返回值)
#include <iostream>
void print(int num) {
std::cout << "Integer: " << num << std::endl;
}
void print(double num) {
std::cout << "Double: " << num << std::endl;
}
void print(const char* str) {
std::cout << "String: " << str << std::endl;
}
int main() {
print(10);
print(3.14);
print("Hello");
return 0;
}
在这个例子中,有三个名为print
的函数,分别接受一个整数、一个双精度浮点数和一个字符串作为参数。根据传入的参数类型,编译器会自动选择正确的函数进行调用。
函数重载的主要优点包括:
- 提高代码的可读性和可维护性:使用相同的函数名表示相似的操作,使得代码更易于理解和维护。
- 增强代码的灵活性:可以根据不同的参数类型和数量执行不同的操作,而不需要为每个操作使用不同的函数名。
- 减少代码重复:避免为相似的操作编写多个不同名称的函数,减少了代码的重复。
函数重载中的一个调用歧义
void f(char b,int a)
void f(int b,char a)
int main()
{
f('b','a');
return 0;
}
//该程序运行的时候就会产生歧义,因为该函数调用的时候会隐式类型转化,而上面两个函数都可以进行转化,从而不知道转化谁,因此不知道调用谁。
5.引用
在 C++ 中,引用(reference)是一种给对象起别名的方式。引用提供了对变量的另一个名称,它允许你以一种更直观的方式操作对象,并且在某些情况下可以提高程序的性能和可读性。
void increment(int& n) {
n++;
}
int main() {
int value = 5;
increment(value);
std::cout << value << std::endl; // 输出 6
return 0;
}
如该程序就是引用这里面n就是value的引用,就相当于给value取了另一个名字n。
//权限的放大,缩小,平移。
int b = 0;
int &a = b;
//权限的平移,a和b都可以读取修改
int b = 0;
const int &a = b;
//权限的缩小,b可以读取和修改a只能读取
const int b = 0;
int a = b;
//权限的放大,b只可以读取,a却可以读取和修改,是不被允许的。
引用和指针的不同:
1.引用概念上为定义一个变量的别名,指针为存储一个变量的地址。
2.引用在定义的时候必须初始化,而指针没有要求。
3.引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向一个同类型的实体。
4.没有空引用,却有空(NULL)指针。
5.在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占的字节个数。
6引用自加即引用的实体的增加,指针自加即指针向后偏移一个类型的大小。
7.有多级指针,但没有多级引用。
8,访问实体方式不同,指针需要显示解引用,引用为编译器自己处理。
9.引用使用时比指针使用起来相对安全。
6.内联函数
在 C++ 中,内联函数是一种以 “inline” 关键字声明的函数。内联函数在编译时会将函数体插入到每一个调用处,而不是像普通函数那样进行函数调用的压栈、跳转等操作,这样可以减少函数调用的开销,提高程序的执行效率。
#include <iostream>
inline int add(int a, int b) {
return a + b;
}
int main() {
int result = add(3, 4);
std::cout << "Result: " << result << std::endl;
return 0;
}
使用内联函数时需要注意以下几点:
- 内联函数通常应该比较短小,如果函数体过大,编译器可能会忽略 “inline” 关键字,不将其作为内联函数处理。
- 内联函数只是对编译器的一个建议,编译器有权决定是否将函数内联展开。
- 内联函数一般在头文件中定义,因为在多个源文件中包含同一个头文件时,编译器需要看到内联函数的完整定义才能进行内联展开。如果内联函数在源文件中定义,而在其他源文件中调用,可能无法正确内联展开。