C++入门(千字整理!详细易懂)

C++基础入门教程 1 C++初识 1.1 第一个C++程序 编写一个C++程序总共分为4个步骤 创建项目 创建文件 编写代码 运行程序 1.1.1 创建项目 ​ Visual Studio是我们用来编写C++程序的主要工具,我们先将它打开 1.1.2 创建文件 右键源文件,选择添加->新建项 给C++文件起个名称,然后点击添加即可。 1.1.3 编写代码 #include<iostream> using namespace std; int main() { cout << 阅读详情

目录

1.C++关键字

2.命名空间

1.命名空间定义

2.命名空间的使用

3.C++输入和输出

4.缺省参数

5.函数重载

6.引用

1.引用概念

2.引用特性

 3.常引用

4.使用场景

5.引用和指针的区别

7.内联函数

1.概念

2.inline的特性

8.auto关键字

9.基于范围的for循环

10.指针空值nullptr


1.C++关键字

2.命名空间

使用命名空间的目的是为了对标识符名进行本地化,避免命名冲突(包含自己编写的名字与库冲突和程序员互相之间编写程序命名的冲突)和名字污染。

1.命名空间定义

需要用到namespace关键字,后面跟命名空间的名字,然后加一对花括号即可,{}内即为命名空间的成员。

命名空间中可以定义变量,函数,类型。可以嵌套。

同一工程头文件和源文件中存在相同名称的命名空间,编译器最后会合成到同一命名空间。

一个命名空间就定义了一个新的作用域。

namespace N1
{
int a;
int b;
int Add(int left, int right)
{
return left + right;
}
namespace N2
{
int c;
int d;
int Sub(int left, int right)
{
return left - right;
}
}
}
2.命名空间的使用

i.加命名空间名称及作用域限定符

ii.使用using将命名空间中某个成员引入

TIPS:::是域作用限定域符

int a=2;

namespace HY
{

int a=10;

}

::a也就是限定了在全局域中寻找a变量。

using namespace HY展开了命名空间,HY::a也就是指定了在HY域中寻找a变量.可以通过这两个方式访问命名空间域。

变量优先局部域>全局域>命名空间域。

iii.使用using namespace 命名空间名称 引入

using namespce HY;
int main()
{
printf("%d\n", HY::a);
printf("%d\n", b);
Add(10, 20);
return 0;
}

3.C++输入和输出

#include<iostream>
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
using namespace std;
int main()
{
int a;
cin>>a;
cout<<"Hello world!!!"<<endl;
return 0;
}

说明:

1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件

以及按命名空间使用方法使用std。

2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含<

iostream >头文件中。

3. <<是流插入运算符,>>是流提取运算符。

4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。

C++的输入输出可以自动识别变量类型。

std命名空间的使用惯例:std是C++标准库的命名空间,如何展开std使用更合理呢?

1. 在日常练习中,建议直接using namespace std即可,这样就很方便。

2. using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对

象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模

大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 +

using std::cout展开常用的库对象/类型等方式。

4.缺省参数

缺省参数是声明或定义函数时为函数的参数制定一个缺省值,调用该函数时有指定实参,优先使用指定实参,如果没有指定实参,就采用该形参的缺省值。

举个例子

void Func(int a = 0)
{
cout<<a<<endl;
}
int main()
{
Func(); // 没有传参时,使用参数的默认值
Func(10); // 传参时,使用指定的实参
return 0;
}

缺省参数分为全缺省参数(为每一个形参都指定一个缺省值)和半缺省参数(部分形参指定)。

void Func(int a = 10, int b = 20, int c = 30)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}//全缺省参数
void Func(int a, int b = 10, int c = 20)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}//半缺省参数

注意:

1.从左往右传参,从右往左缺省。半缺省参数必须从右往左依次给出,不能间隔着给。

2.缺省参数不能在函数声明和定义中同时出现,声明给定义不给。

3. 缺省值必须是常量或者全局变量。

4.C语言不支持

5.函数重载

函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数。这些同名函数的形参列表(参数个数或参数类型或参数类型顺序不同)不同,常用来处理实现功能类似数据类型不同的问题。

如下:

#include<iostream>
using namespace std;
// 1、参数类型不同
int Add(int left, int right)
{
cout << "int Add(int left, int right)" << endl;
return left + right;
}
double Add(double left, double right)
{
cout << "double Add(double left, double right)" << endl;
return left + right;
}
// 2、参数个数不同
void f()
{
cout << "f()" << endl;
}
void f(int a)
{
cout << "f(int a)" << endl;
}
// 3、参数类型顺序不同
void f(int a, char b)
{
cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
cout << "f(char b, int a)" << endl;
}
int main()
{
Add(10, 20);
Add(10.1, 20.2);
f();
f(10);
f(10, 'a');
f('a', 10);
return 0;
}

 下面这个例子是重载,但是存在无参调用时的歧义。

void f()
{
cout<<"f()"<<endl;
}
void f(int a=0)
{
cout<<"f(int a)"<<endl;
}

为什么C语言无法构成重载,C++可以? 


采用C语言编译器

在linux下,采用gcc编译完成后,函数名字的修饰没有发生改变。

采用C++编译器

在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参数类型信息添加到修改后的名字中。
通过这里就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修

饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。

如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办

法区分。

6.引用

1.引用概念

引用不是定义了一个新变量,而是给以存在的变量取了别名,它和它引用的变量共用一块内存空间。举个形象的例子:李逵在家里被称为铁牛,在江湖上被称为黑旋风。

类型&引用变量名(对象名)=引用实体

void TestRef()
{
int a = 10;
int& ra = a;//<====定义引用类型
printf("%p\n", &a);
printf("%p\n", &ra);
}

 形参是实参的别名,我们知道在调用swap函数的时候,必须传址调用,否则函数结束,栈回收空间,不会改变原来实参的值。但是学习了引用我们就可以这么声明。 

void swap(int &a,int&b);

同理,在链表尾插的时候,由于要修改链表的头指针,需要传二级指针,但是现在就可以这么声明。

void ListPushback(struct ListNode*&phead,int x);

注:引用类型必须和引用实体同类型。 

2.引用特性

1)引用在定义时必须初始化

2)一个变量可以有多个引用,一个引用只能引用一个实体。如下:

void TestRef()
{
int a = 10;
// int& ra; // 该条语句编译时会出错
int& ra = a;
int& rra = a;
printf("%p %p %p\n", &a, &ra, &rra);
}

3)引用过程中权限不能放大,只能平移或缩小。 

下面举例充分理解!!

1.const int a=0;
int &b=a;//错误,引用过程中权限不能放大。
2.const int c=0;
int d=c;//正确,只是将c的值拷贝给d,没有放大权限,d改变不影响c。
3.int x=0;
int &y=x;
const int&z=x;//正确,权限可以平移或缩小。
++x;//正确,y,z的值也会跟着改变
++z;//错误,x,y可以改变,z不可以
4.int func1()
{
static int x=0;
return x;
}
int &func2()
{
static int x=0;
return x;
}
int&ret1=func1();//权限放大
const int&ret1=func1();//权限平移
int ret1=func1();//拷贝
int &ret2=func2();//权限平移
const int&ret2=func2();//权限缩小
 
 

 3.常引用
void test()
{
    const int a = 10;
    int& ra = a;   // 该语句编译时会出错,a为常量
    //正确写法:const int& ra = a;
    
    const int& ra = a;
    int& b = 10; // 该语句编译时会出错,b为常量
    //正确写法:const int& b = 10;
    
    const int& b = 10;
    double d = 12.34;
    int& rd = d; // 该语句编译时会出错,类型不同
    //正确写法:const int& rd = d;
}
4.使用场景
  1. 做输出型参数,提高效率(一般是大对象/深拷贝类对象)
    void Swap(int& left, int& right)
    {
       int temp = left;
       left = right;
       right = temp;
    }
    
  2. 做返回值,相较于普通传值访问,不会产生临时变量,减少了值拷贝的过程,引用传值访问可以修改返回的结果。
  3. 注:引用返回时返回的必须是静态变量(静态局部变量生命周期是整个程序运行的周期,不会在函数调用时被销毁)(如情况1)或者是堆上的变量 
int& Count()
{
   static int n = 0;//情况1
   int n=0;//情况2
   n++;
   // ...
   return n;
}
int ret=Count(n);

 如果为情况2,count函数结束,栈帧销毁,没有清理栈帧,那么ret结果侥幸正确,若清理了栈帧,则ret的结果为随机值(因为调用其他函数建栈帧时可能会覆盖)。

下面代码输出什么结果?为什么?


int& Add(int a, int b)

{
int c = a + b;
return c;
}
int main()
{
int& ret = Add(1, 2);
Add(3, 4);
cout << "Add(1, 2) is :"<< ret <<endl;
return 0;

}//结果ret=7

总结:基本任何场景都可以用引用传参,但是用引用返回时要注意:

如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用引用返回,如果已经还给系统了,则必须使用传值返回。 (常见的正确案例:static修饰的,malloc)

5.引用和指针的区别

1.在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。

int main()
{
int a = 10;
int& ra = a;
cout<<"&a = "<<&a<<endl;
cout<<"&ra = "<<&ra<<endl;
return 0;}

2.在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。

int main()
{
int a = 10;
int& ra = a;
ra = 20;
int* pa = &a;
*pa = 20;
return 0;
}

 对比引用和指针的汇编代码:

 引用和指针的不同点:(面试常考,理解记忆)

1. 概念上引用定义一个变量的别名,指针存储一个变量地址。

2. 引用在定义时必须初始化,指针没有要求

3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何 一个同类型实体

4. 没有NULL引用,但有NULL指针

5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32 位平台下占4个字节)

6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小

7. 有多级指针,但是没有多级引用

8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理

9. 引用比指针使用起来相对更安全

7.内联函数

1.概念

以inline修饰的函数叫做内联函数,一般而言编译时C++编译器会在调用内联函数的地方展开(类似于宏,但是宏由于操作符的优先级需要添加多个括号,如下实现一个简单的加法)。

#define Add(a,b) ((a) + (b))

【面试题】宏的优缺点?

优点:
1.增强代码的复用性。
2.提高性能。

缺点:
1.不方便调试宏。(因为预编译阶段进行了替换)
2.导致代码可读性差,可维护性差,容易误用。3.没有类型安全的检查 。

C++有哪些技术替代宏?

1. 常量定义 换用const enum

2. 短小函数定义 换用内联函数

因此为了避免这种错误,C++新增了内联函数inline来解决这个问题。不需要刻意的写很多括号来保证操作符的正确使用顺序。

2.inline的特性
  1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。
  2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。
  3. inline建议直接定义在源文件,不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。
  4. 可以在同一个项目的不同源文件内定义函数名相同但实现不同的inline函数

8.auto关键字

auto 会自动推出变量的类型,在对于一些变量类型比较长不方便书写时可以用到。

使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。

int TestAuto()
{
return 10;
}
int main()
{
int a = 10;
auto b = a;
auto c = 'a';
auto d = TestAuto();
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;
cout << typeid(d).name() << endl;
//auto e; 无法通过编译,使用auto定义变量时必须对其进行初始化
return 0;
}

用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&

当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量

void TestAuto()
{
auto a = 1, b = 2;
auto c = 3, d = 4.0; // 该行代码会编译失败,因为c和d的初始化表达式类型不同
}

注:

  1. auto不能作为函数的参数。
  2. auto不能直接用来声明数组。
  3. 为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法。
  4. auto在实际中最常见的优势用法就是跟以后会讲到的C++11提供的新式for循环,还有lambda表达式等进行配合使用。

9.基于范围的for循环

对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。

因此C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。与普通循环类似,可以用continue来结束本次循环,也可以用break来跳出整个循环。

void TestFor()
{
int array[] = { 1, 2, 3, 4, 5 };
for(auto& e : array)
e *= 2;
for(auto e : array)
cout << e << " ";
return 0;
}

实际过程是将arr中每个数放到e中乘以2,再将 arr 中的每一个数拿出来放到 e 中进行输出。

使用条件:

1.for循环迭代的范围必须是确定的
对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围。
  

这样写就是有问题的,因为 for 的范围不确定。
2.迭代的对象要实现++和==的操作,这里针对的是类。

10.指针空值nullptr

在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下方式对其进行初始化:

void test_ptr()
{
	int* p1 = NULL;
	int* p2 = 0;
	//……	
}

NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:

#ifndef NULL
#ifdef __cplusplus
#define NULL   0
#else
#define NULL   ((void *)0)
#endif
#endif

可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。不论采取何种定义,在使用空值的指针时都不可避免的会遇到一些麻烦,比如:

void f(int)
{
 	cout<<"f(int)"<<endl;
}
void f(int*)
{
 	cout<<"f(int*)"<<endl;
}
int main()
{
 	f(0);
 	f(NULL);
 	f((int*)NULL);
 	return 0;
}

 程序本意是想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,因此与程序的初衷相悖。
 在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)0。

注意:

  1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
  2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
  3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。
C++基础入门 编写一个C++程序总共分为4个步骤​ Visual Studio是我们用来编写C++程序的主要工具,我们先将它打开右键源文件,选择添加->新建项给C++文件起个名称,然后点击添加即可。 1.1.4 运行程序 作用:在代码中加一些说明和解释,方便自己或其他程序员程序员阅读代码两种格式作用:给一段指定的内存空间起名,方便操作这段内存语法:示例: 1.4 常量 作用:用于记录程序中不可更改的数据C++定义常量两种方式#define 宏常量: const修饰的变量 示例: 1.5 关键字 **作用:**关键字是 阅读详情

相关推荐

【C++初阶】一、C++入门基础(详细总结)

C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字(随自己定义),然后接一对{}即可,{}中即为命名空间的成员。注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。

Clumsy、笨拙的博客 1万+

C++基础入门学习笔记

C++基础入门 1.1 hello world #include<iostream> using namespace std; int main() { cout << "Hello world" << endl; system("pause"); return 0; } 1.2 注释 作用:在代码中加一些说明和解释,方便自己或其他程序员程序员阅读代码 两种格式 单行注释:// 描述信息 通常放在一行代码的上方,或者一条语句的末尾,对该行代码说明

weixin_43544679的博客 8479

C++ LinuxWebServer 2万7千字的面经长文(下)

1、包含多个源文件的项目在编译时有长而复杂的命令行,可以通过makefile保存这些命令行来简化该工作2、make可以减少重新编译所需要的时间,因为make可以识别出哪些文件是新修改的3、make维护了当前项目中各文件的相关关系,从而可以在编译前检查是否可以找到所有的文件makefile:一个文本形式的文件,其中包含一些规则告诉make编译哪些文件以及怎样编译这些文件,每条规则包含以下内容:一个target,即最终创建的东西。

忆_恒心的博客 3143

C++基础入门(超详细)

c++

2301_76575356的博客 1万+

C++ LinuxWebServer 2万7千字的面经长文(上)

`Linux Web Server`项目虽然是现在C++求职者的人手一个的项目,但是想要吃透这个项目,还是需要一定的基础的,以项目为导向,进行基础的学习。 涵盖了计算机网络(网络编程)常见的知识点和常见的操作系统知识。 参加过大大小小的**互联网厂和银行**的秋招和春招的笔试与面试,整理了下面的2万7千字的长文(:smile:都是干货,写作不易啊),喜欢,觉得有帮助的,欢迎订阅专栏,后续有很多优质的文章进行更新,有任何疑问,欢迎留言!

忆_恒心的博客 9652

C++ Linux Web Server 面试基础篇-计网(一)

一个完整的业务可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这个就是TCP的拆包和粘包问题。

忆_恒心的博客 2184

4千字详细讲解JVM中的垃圾回收!

看完这篇垃圾回收,能跟面试官扯半天了

yehongzhi1994的博客 348

C++笔记之数据单位与C语言变量类型和范围

为了提高程序的可移植性,C99标准引入了固定宽度的整数类型,定义在<stdint.h>头文件中。这些类型确保了不同系统和编译器上变量类型的位宽一致性,从而避免了因为平台差异导致的溢出或数据损失问题。类型含义大小(字节)范围2 的幂次方表示int8_t8 位有符号整数1-128到127-2⁷到2⁷ - 1uint8_t8 位无符号整数10到2550到2⁸ - 1int16_t16 位有符号整数2-32,768到32,767-2¹⁵到2¹⁵ - 1uint16_t16 位无符号整数2。

小勇博客 669

一文入门Go云原生微服务「爆肝6千字」

Go 云原生开发有着天然的优势,云原生系统需要可扩展、耦合、弹性可管理。Go 的设计就是为云原生时代构建的语言:简单高效、快速编译、支持现代网络和多核计算、支持高并发、内存安全,帮助用户专注于解决问题而不是受限于语言的复杂性。打好基础要想一文入门Go微服务还是需要有些前提条件的,打好基础:已经掌握了Golang的基础知识,如果基础薄弱,欢迎学习的我的Go语言学习专栏,查漏补缺。了解Protobuf...

王中阳讲编程 564

C++求职LinuxWebServer面试篇(项目介绍)

无论过去多少年,对于`C++`求职者而言,`LinuxWebSerer`真的是一个非常推荐学习的项。 什么项目适合写在简历上的面试上呢?一个可以体现出基础知识以及能够进行扩展知识的项目就是好项目! `LinuxWerbServer` 就是这么一个项目。 > 从之前作为面试求职者到现在自己入职后的工作感受,以及作为面试官后的感悟。 这个项目真的很值得深挖。 如何在最短的事件里,掌握最重要、基础的编程知识。

忆_恒心的博客 779

C++ Linux Web Server 面试基础篇-计网(三)

【导读】Linux Web Server项目虽然是现在C++求职者的人手一个的项目,但是想要吃透这个项目,还是需要一定的基础的,以项目为导向,进行基础的学习。涵盖了计算机网络(网络编程)常见的知识点和常见的操作系统知识。

忆_恒心的博客 896

网络安全最全千字长文,小白怎么入门网络安全!?(1),字节跳动上千道精选面试题还不刷起来

不同于Java、C/C++等后端开发岗位有非常明晰的学习路线,网路安全更多是靠自己摸索,要学的东西又杂又多,难成体系。常读我文章的朋友知道,我的文章基本以故事为载体的技术输出为主,很少去谈到职场、面试这些方面的内容。主要是考虑到现在大家的压力已经很大,节奏很快,公众号上是让大家放松的地方,尽量写一些轻快的内容。不过随着越来越多的人问我上面这些问题,今天就专门写一篇来摆一摆这个龙门阵。

2303_79055586的博客 456

C++ Linux Web Server 面试基础篇-计网(二)

【导读】Linux Web Server项目虽然是现在C++求职者的人手一个的项目,但是想要吃透这个项目,还是需要一定的基础的,以项目为导向,进行基础的学习。涵盖了计算机网络(网络编程)常见的知识点和常见的操作系统知识。

忆_恒心的博客 634

macOS离线会议笔记应用Minute:基于Whisper与llama.cpp的本地AI解决方案

语音识别(ASR)与自然语言处理(NLP)是人工智能领域的关键技术,它们通过算法模型实现对人类语音和文本的理解与生成。其核心原理涉及声学建模、语言建模以及注意力机制等深度学习架构。这些技术的工程价值在于能够自动化处理海量非结构化音视频与文本数据,显著提升信息处理效率。在应用场景上,广泛服务于智能会议纪要、内容摘要生成、任务项提取等办公自动化需求。本文聚焦的Minute项目,正是基于开源的Whisper语音识别模型与llama.cpp大语言模型推理框架,构建的一款完全离线运行的macOS会议笔记应用。它通过本

weixin_34072637的博客 437

PnP 单目相机位姿估计(二):solvePnP利用二维码求解相机世界坐标

前言 原理简介 输入参数准备 1 objectPoints特征点世界坐标 2 imagePoints特征点在摄像头下的像素点坐标 3cameraMatrixdistCoeffs内参矩阵和畸变矩阵 相机世界坐标的求解 1求世界坐标中的点在相机坐标系下的坐标 2求相机在世界坐标中的坐标 3效果求解相机在世界坐标系下的坐标点 4求解代码1.前言  很多时候,当我们利用单目相机获取图像时,往往只能获取图像中

cocoaqin的博客 5万+

Win10系统下Protel 99 SE元件库导入报错?3步搞定File is not recognized问题

本文详细介绍了在Win10系统下解决Protel 99 SE元件库导入报错'File is not recognized'的3步终极方案。通过手动修改配置文件、使用专用工具和优化系统兼容性设置,帮助用户快速解决这一经典PCB设计软件的兼容性问题,提升工作效率。

m3n5b7v8c9x的博客 796

C++求职LinuxWebServer面试篇(响应Http请求报文)

秋招又开始了,最近陆陆续续有很多学弟学妹私信我分享学习和面试的资料,因此我打算通过LinuxWebServer项目,以项目的方式串联起面试期间高频的知识点。 现在的八股文真是满天飞,很多你看完后没去用也无法理解,面试官一深追就容易露馅。因此我想整理一篇以项目为切入点的面经指南。 C++求职LinuxWebServer面试篇 打牢编程基础,快速掌握面试要点,短时间内让你熟悉C++开发项目中,计算机网络和操作系统的重要意义。

忆_恒心的博客 1498

别急着编译!修复银河麒麟OpenSSH漏洞前,先搞懂ssh、sshd版本与apt仓库的“爱恨情仇”

本文深度解析银河麒麟OpenSSH漏洞(CVE-2023-38408)修复策略,揭示版本差异背后的企业级维护逻辑,提供从APT升级到源码编译的多维度方案评估。特别针对路径隔离方案和离线环境处理给出技术细节,帮助企业制定兼顾安全与稳定的升级决策框架。

weixin_26642481的博客 454

NOIP初赛知识整理

NOIP初赛知识整理 包括硬件、互联网、算法、编程等相关部分

zyx1415926的博客 666

GEE土地分类:土地分类精度评定和分类后影像进行(Kmeans,Gmeans,SNIC (Simple Non-Iterative Clustering)聚类分析和滤波(focal_mode)分析

使用聚类分析和滤波分析来进一步处理土地分类后的影像数据。聚类分析可以帮助您识别影像中的相似区域。您可以使用聚类算法,如K均值聚类或层次聚类,将像素分组到具有相似像素值的群集中。这可以帮助您更好地理解图像中的空间模式和结构,并可能揭示有用的信息。滤波分析可以帮助您平滑图像并去除噪声。常见的滤波器包括中值滤波器和高斯滤波器。这些滤波器可以帮助您消除图像中的随机变化,并使其更易于解释和分析。

此星光明博客 2516

基于YOLOv8深度学习的夜视行人检测系统:UI界面 + YOLOv8 + 数据集的实现

为了解决这一问题,基于深度学习的行人检测技术,尤其是YOLO(You Only Look Once)系列算法,成为了一个有效的解决方案。本文将详细介绍如何构建一个夜视行人检测系统,利用YOLOv8模型实现高效的行人检测,并设计用户友好的界面以便于使用。本博客详细介绍了如何构建一个基于深度学习的夜视行人检测系统,包括数据准备、YOLOv8模型训练、用户界面设计和实时监控模块的实现。为了将数据集转换为YOLO格式,我们需要确保每个图像文件都有一个对应的标签文件,标签文件中包含行人的边界框信息。

YOLO 1172

2026 春招 | 互联网技术岗职业选择全指南,给应届毕业生的真心话(7千字解析,看不完先收藏)

本文针对2026届互联网校招技术岗选择问题,从资深技术管理者的视角分析了主流岗位特点与就业形势。文章重点剖析了后端开发(Java/Go)、前端开发、C++基架开发、AI应用开发、客户端开发、游戏开发及测试开发等方向的岗位需求、技术特点与职业前景,指出后端岗位竞争加剧但职业周期长,前端/客户端校招易但社招难等关键差异。特别强调校招生应结合个人兴趣与行业需求选择方向,避免盲目跟风热门但内卷严重的Java后端。最后推荐使用AI面试工具提升面试表现,建议学生专注技术深耕与充分准备,在激烈竞争中把握机遇。

m0_47082992的博客 1424

基于Cesium实现,动态水面+大坝排水动画

一、绘制面状水域,使用水波纹理,进行渲染,水体透明,可以看到底色。三、使用粒子系统,将喷泉改变方向,加上重力设置,实现排水动画。二、绘制线状三维体,用作模拟大坝拦截效果。四、最后,模拟水位上升,进行淹没分析,

一醉千秋的专栏 1420

OpenClaw+Phi-3-mini-128k-instruct实战:本地AI助手自动化办公指南

本文介绍了如何在星图GPU平台上自动化部署Phi-3-mini-128k-instruct镜像,打造本地AI助手实现办公自动化。该方案支持智能文件整理、邮件自动处理和会议纪要生成等场景,尤其适合需要处理敏感数据的企业用户,所有操作均在本地完成,确保数据隐私安全。

weixin_30978239的博客 404

编织数据的实时脉络——构建基于MySQL的数据编织平台,实现实时数据治理

除了上述基本设置外,我们还可以根据实际应用场景自定义一些特定的监控项目。例如,对于某些高并发读写的表,可能需要特别关注它们的锁等待时间和回滚段使用率;而对于涉及到跨库关联查询的操作,则应当着重检查网络延迟及缓存命中率等因素。-- 获取InnoDB行级锁等待情况-- 统计各表的缓存命中率这段SQL脚本不仅展示了如何查询InnoDB引擎下的锁争用状况,还介绍了计算表级别缓存命中率的方法,有助于深入理解系统的运行状态。

墨夶的博客 1789

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

上一篇: 文件及文件操作
下一篇: C++类和对象(上)
宋恩淇要努力
博客等级 码龄2年 108粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值