C++初阶 —— 入门/概念

C++入门(保姆级教程) c++入门看这一篇就够了 阅读详情
AI摘要

本文介绍C++初学者必须掌握的核心概念,包括命名空间、引用、函数重载、内联函数、auto关键字、范围for循环及nullptr等C++11新特性。重点讲解语法细节与常见误区,帮助理解C++相对于C的语言优势与设计思想。

目录

一,关键字(C++98)

二,命名空间 

命名空间定义

命名空间使用

三,C++输入/输出

四,缺省参数

五,函数重载

六,引用

七,内联函数

八,auto关键字(C++11)

九,基于范围的for循环(C++11)

十,指针空值nullptr(C++11)


一,关键字(C++98)

  • C语言32个关键字;
  • C++98总共63个关键字;

二,命名空间 

        在C/C++,如大量变量、函数、类的名称都存在于全局作用域中,可能会导致很多冲突;使用命名空间(namespace)的目的就是对标识符的名称进行本地化,以避免命名冲突或名字污染;

        std是C++ 标准库中命名空间的名称,其中包含了大部分标准库的函数和类,使用std命名空间来访问其中的类和函数;

命名空间定义

namespace + 命名空间名字 + { };

  • 命名空间可嵌套;
  • 同一个工程可存在多个相同命名空间,编译器最后会合成到同一个命名空间中;
  • 一个命名空间即定义一个新的作用域,其中所有内容都局限于该空间中;
  • VS19编译器,关键字namespace不可在函数内定义命名空间;
//命名空间,N为命名空间名字
namespace N
{
    //可定义变量,也可定义函数
	int a;
	void fun() {};
}
//可嵌套
namespace N
{
	int a;
	void fun() {};
	namespace N
	{
		int a;
		void fun() {};
	}
}
//命名空间可相同,最后会合并
namespace N
{
	int a;
	void fun1() {};
}

namespace N
{
	int b;
	void fun2() {};
}

命名空间使用

  • 使用命名空间成员
    • 命名空间名称 + 作用域限定符("::");
    • 优:不存在命名污染;缺:使用麻烦;
  • 将内部成员全部展开(全部内容,类似全局)
    • using namespace + 命名空间名称;
    • 优:使用方便;缺:暴漏自身,容易命名污染;
  • 引入指定成员(指定内容,类似全局)
    • using + 命名空间名称::命名空间成员;
//命名空间名称+限定符
int main()
{
	N::a = 2;
    N::N::a = 2;
	return 0;
}
//using namespace + 命名空间名称
using namespace N;
int main()
{
	a = 2;
	b = 2;
	return 0;
}
//using + 命名空间成员
using N::a;
int main()
{
	a = 2;
	return 0;
}

using关键字

  • 引入命名空间所有成员,using namespace N;
  • 引入命名空间特定成员(变量或函数),using N::a;
  • C++11引入简化类型名称,即创建别名,using name = type;
    • 传统C语言使用typedef创建别名;
//声明类模板别名,不可在函数内使用
template<typename T>
using IntVector = std::vector<T>;

//声明实例类(类型)别名
using IntVector = std::vector<int>;
//在类内部声明的别名
template<class T>
class A
{
public:
	using MyInt = int; //类内可以直接使用
private:
	MyInt _i;
	T _var;
};

A<int>::MyInt var; //但在内外使用必须加上所属类作用域

三,C++输入/输出

  • cout 标准输出(控制台);
  • cin 标准输入(键盘);
  • 需包含头文件<iostream>,及标准命名空间std;
  • endl一行输出结束输出下一行(等价于"\n");
#include <iostream>
int main()
{
	std::cout << "hello world!" << std::endl;
	return 0;
}
//推荐此方式
#include <iostream>
using namespace std;
int main()
{
	cout << "hello world!" << endl;
	return 0;
}
//输入输出
#include <iostream>
using namespace std;
int main()
{
	int a, b;
	cin >> a >> b;
	cout << a << "/" << b << endl;
	return 0;
}

注:

  • 早期标准库没有在std命名空间中实现,只需包含.h的头文件即可,后来为了和C头文件区分及正确使用命名空间,规定头文件不带.h;
  • 使用C++输入输出更方便,无需数据格式控制,自动识别类型,如%d/%c等,浮点数最多输出五位,但类似结构体的连续输出用printf更好;

四,缺省参数

  • 是指声明或定义函数时,为函数的参数指定一个默认值;
  • 在调用函数时,如未指定实参则使用该默认值;
#include <iostream>
using namespace std;
void fun(int a = 0)
{
	cout << a << endl;
}
int main()
{
	fun();
	fun(10);
	return 0;
}

 分类

  • 全缺省参数;
  • 半缺省参数;
//全缺省参数
void fun(int a = 0, int b = 1, int c = 2)
{
	cout << a << b << c << endl;
}
//半缺省参数
void fun(int a , int b = 1, int c = 2)
{
	cout << a << b << c << endl;
}

注:

  • 参数必须从右往左依次给出,不可间隔;
  • 缺省参数不可在函数声明和定义中同时出现,如声明和定义缺省位置默认值不同,编译器无法确定默认值,即使默认值相同也不可,此时建议定义是不加默认值;
  • 缺省值必须是常量或全局变量;
  • C不支持;
//支持全局变量
int ab = 1212;
void fun(int a = ab)
{
	cout << a << endl;
}

五,函数重载

        函数重载是函数的一种特殊情况,C++允许同一个作用域中声明几个功能类似的同名函数,其形参列表(参数个数或类型或顺序)必须不同,常用来实现功能类似数据类型不同的问题;进而保持代码的可读性和维护性;

函数名相同,参数不同;即通过传递的参数不同,调用不同函数;

  • 必须在同一作用域,同一命名空间下;
  • 必须有不同参数列表,即参数个数、类型、顺序不同;
  • 不可仅通过返回值类型不同来区分函数,会被认为是函数重定义,导致编译错误;
    • 语法调用层面,无法区分,严重歧义;
  • 可与默认参数一起使用,即缺省参数时使用默认值;
  • 返回值要匹配返回类型;
//可根据参数不同调用不同函数
int Add(int a, int b) { return a + b; }
double Add(double a, double b) { return a + b; }
int main()
{
	Add(1, 2);
	Add(1.0, 2.0);
	return 0;
}

名字修饰(name mangling)

        运行程序时,需经历:预处理、编译、汇编、链接;在编译后链接前,如a.o目标文件中无Add函数的地址,地址在b.o文件中,链接器会到b.o符号表中查找地址,然后链接;链接时,依据名字(函数名修饰)查找,不同编译器修饰规则不同;如:g++函数名修饰规则,[_Z+函数长度+函数名+类型首字母];

  • C语言不支持重载,因为同名函数无法区分;
  • C++通过函数名修饰规则来区分,修饰出来的名字不一样;

注:(f.h/f.c/test.c)

  • 预处理:头文件的展开、宏替换、条件编译、去掉注释,f.i/test.i;
  • 编译:检查语法,生成汇编代码,f.s/test.s;
  • 汇编:把汇编代码转化为二进制机器码,目标文件f.o/test.o;
  • 链接:链接到一起,生成可执行程序.exe;

extern "C"

        在C++中有时候可能需要将某些函数按照C的风格来编译,在函数前加extern "C";即编译后的函数修饰名,可调用C库;C++编译器,既可识别C++函数名修饰规则,也可识别C的修饰规则(兼容C);如C的项目调用C++的库,可在C++库的函数前添加extern “c”即可;

//按C编译
extern "C" int Add(int a, int b) { return a + b; }

六,引用

  • 不是定义一个新的变量,而是给已存在的变量取个别名;
  • 编译器不会为引用的变量开辟内存空间,是共用同一块内存空间的;

类型 + & + 引用变量名(即别名) = 引用实体

  • 引用类型必须和引用实体类型一致;
//引用变量
int a = 10;
int& ra = a;

//引用变量
int a = 10;
int* pa = &a;
int*& rpa = pa;

特性

  • 引用在定义时必须初始化;
  • 一个变量可以有多个引用(即多个别名);
  • 引用一旦引用一个实体,再也不能引用其他实体(即不能同时引用两个实体);
  • 不可引用常量或字面值;
int& ra; //此时会报错,必须初始化;
//一个变量可以有多个引用(即多个别名)
int a = 10;
int& ra = a;
int& rb = a;
//引用一旦引用一个实体,再也不能引用其他实体(即不能同时引用两个实体)
int a = 10;
int b = 20;
int& ra = a;
ra = b; //此为给ra赋值;
int& ra = b; //报错,重定义

常引用

  • 可保护形参,形参不会被改变;
  • 即可传变量,也可传常量;
const int a = 10; 
//int& ra = a; //编译时会报错,因为a为常变量,且不可扩大读写权限
const int& ra = a;
//int& ra = 10; //编译时会报错,因为10为常量
const int& ra = 10; //常量引用(有const)
//可缩小读写权限,但不可放大读写权限
int a = 10;
int& ra = a;
const int& rb = a;
//保护形参,避免误改
void PrintStack(const ST& s);
//即可传变量,也可传常量
int Add(const int& a, const int& b)
{
	return a + b;
}
int main()
{
	int a = 10, b = 20;
	Add(a, b);
	Add(1, 2);
	return 0;
}
int a = 3.14;
double b = a; //类型转换中间会产生一个临时变量
//double& ra = a; 
const double& ra = a; //类型转换中间会产生一个临时变量,临时变量具有常性

使用场景

  • 做参数,避免拷贝提高效率(引用传参)、可修改参数(输出型参数);
  • 做返回值;
//做参数
//因为是实参的别名,实际交换的就是原本的参数变量,类似指针;
void Swap(int& a, int& b)
{
	int tmp = a;
	a = b;
	b = tmp;
}
//C语法
void SListPushBack(SLTNode** phead, int x);
//C++语法
void SListPushBack(SLTNode*& phead, int x);
//传值返回
//c出作用域会销毁,编译器会生成一个临时变量,复制c的值
//临时变量,如比较小通常再寄存器,如比较大会再main中开辟一块空间
int Add(int a, int b)
{
	int c = a + b;
	return c;
}

int main()
{
	const int& a = Add(1, 2); //临时变量tmp赋值a
}
//传引用返回
//临时引用,int& tmp=c;
int& Add(int a, int b)
{
	int c = a + b;
	return c; //c局部变量
}
//const int& Add(int a, int b)
//{
//	return a + b; //a+b产生临时对象会立即销毁
//}

int main()
{
	int& a = Add(1, 2); //局部变量赋值给a(局部变量在函数结束会销毁)
}

注:如函数返回时,出了函数作用域,返回对象还未还给系统,则可使用引用返回,如已还给系统,则必须传值返回;

传值/传引用效率对比

用值作为参数或返回值,效率低下,尤其是非常大时;

  • 以值作为参数,在传参时函数不会直接传递实参,而是传递实参的拷贝;
  • 以值作为返回值,在返回期间函数不会将变量本身直接返回,也是返回变量的一份临时拷贝;

引用和指针的区别

在语法上,引用是别名无独立空间,和引用实体共用同一块空间;

在实现上,实际是有空间的,因为引用是按照指针方式实现的(汇编代码完全类似);

  • 引用在定义时必须初始化,指针没有要求;
  • 引用初始化后,不能在引用其他实体,而指针可在任何时候指向任何同类型实体;
  • 没有NULL引用,但有NULL指针;
  • sizeof含义不同,引用为引用类型的大小,指针始终是地址空间字节个数(4/8);
  • 自加不同,引用为引用实体加1,指针则为向后偏移一个类型大小;
  • 有多级指针,无多级引用;
  • 指针需显式解引用,引用编译器自动处理;
  • 引用比指针使用相对安全;

七,内联函数

        以inline修饰的函数叫做内联函数,C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率;C语言是利用宏实现的;

特性

  • inline是一种以空间交换时间的做法,省去调用函数的开销,所以代码很长或有循环/递归函数不宜使用做为内联函数;
  • inline对于编译器只是个建议,编译器会自动优化,如定义为inline的函数体内有循环/递归等,编译器会优化忽略掉内联;
  • inline不建议声明和定义分离,分离会导致链接错误,因为inline被展开,就没有函数地址了,链接就会找不到;

宏优点

  • 增强代码复用性;
  • 提高性能; 

宏缺点

  • 语法复杂,容易出错;
  • 无类型安全检查;
  • 无法调试和递归;

C++替代宏

  • const/enum替代宏常量;
  • inline替代宏函数;

八,auto关键字(C++11)

        早期C/C++中,使用auto修饰的变量具有自动生命周期变量(多余,变量默认拥有自动的生命周期),但一直没有人去使用;C++11中,auto不在是一个存储类型标识符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时推导而得;

  • 使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型;
  • 因此auto并非是一种类型的声明,而是一个类型声明时的占位符,编译器在编译时会将auto替换为实际变量类型;
//通过右边赋值对象,自动推导变量类型
int a = 10;
auto b = a;

//定义变量时,必须初始化
//auto b;

auto使用细则

  • auto可与指针和引用结合起来使用,用auto声明指针类型时,用auto和auto*没有区别,但用auto声明引用类型时则必须加&;
  • 在同一行定义多个变量,但在同一行声明多个变量时,必须是相同类型,否则编译器报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量;
int a = 10;
int& ra = a;
auto b = a; //int
//推导指针
auto c = &a; //int*
auto* cc = &a; //int*
//推导引用
auto d = ra; //int
auto& dd = a; //int&
//定义多个变量,必须是相同类型
int a;string b;
//auto c = a, d = b;

auto不能推导的场景

  • auto不能作为函数的参数;
  • auto不能直接用来声明数组;
  • 为了避免与C++98中的auto混淆,C++11保留了auto作为类型标识符的用法;
  • auto实际中最常见的优势用法,是跟新式for循环及lambda表达式等进行配合使用;
//auto不能作为函数的参数
void fun(auto a){}
//auto不能直接用来声明数组
auto arr[] = { 1,2,3 };

注:auto关键字详解链接!

九,基于范围的for循环(C++11)

        对于有范围的集合,有程序员来说明循环的范围是多余的,有时还会容易犯错误;因此C++11中引入基于范围的for循环;

语法:for( 用于迭代的变量 :被迭代的范围){ 循环体 }

int main()
{
	int arr[] = { 1,2,3 };
	for (auto& i : arr)
	{
		i = 1;
	}
	for (auto i : arr)
	{
		cout << i << endl;
	}
	return 0;
}

注:与普通循环类似,可用continue来结束本次循环,或break来跳出整个循环;

范围for使用条件

  • for循环迭代的范围必须是确定的;
  • 迭代的对象要实现++和==操作;

注:范围for详解链接;

十,指针空值nullptr(C++11)

        空指针,不是内存不存在的指针,是内存为第一个字节的编号,一般不使用这个字节数据;空指针一般用来初始化,表示指针指向无效的空间;

C++98中的指针空值

  • NULL实际是一个宏,可能被定义为字面常量0,或无类型指针常量(void*);
//C语言
#define NULL ((void *)0)

//一个指针没有合法的指向时,指定一个空值
//把void*类型赋予p1,其实会隐式转换相应的类型
int* p1 = NULL;
int* p2 = 0;

C++11指针空值nullptr

C++为强类型,无法隐式转换,引入nullptr表示空指针;

  • 不需包含头文件,nullptr是作为新关键字引入的;
  • 用来代替传统C++中的0或NULL表示空指针的做法;
  • sizeof(nullptr)与sizeof((void*)0)所占字节数相同;

优点:

  • nullptr更能体现指针本质,清晰明了;
  • 使用模板时,传递0或NULL给指针参数容易导致问题;
  • 为了提高代码的健壮性,后续表示指针空值时建议最好使用nullptr;
void f(int a){cout << "f(int)" << endl;}
void f(int* a){cout << "f(int*)" << endl;}
int main()
{
	f(0); //f(int)
	f(NULL); //f(int)
	f((int*)NULL); //f(int*)
    f(nullptr); //f(int*)
}
#ifndef NULL
    #ifdef __cplusplus
        #define NULL 0
    #else
        #define NULL ((void *)0)
    #endif
#endif

C++(老百科) C++是一种计算机高级程序设计语言,由C语言扩展升级而产生 ,最早于1979年由本贾尼·斯特劳斯特卢普在AT&T贝尔工作室研发。––––以上源自于百度百科总的来说C++和C,C#,Python,Java……一样,都是一种编程语言.1.C++是一种静态类型的,编译式的,通用的,大小写敏感的,不规则的编程语言运行阶段不再处理有关类型的问题,性能高速度快代码中的缺陷充分暴露在编译阶段,运行时更安全代码编辑器可提供代码自动补全等人性化辅助功能数据完整性更好那什么又是编译型语言呢?编译型语言。 阅读详情

相关推荐

C++基础知识

C++是C的增强版本C++是完全兼容C,只要是合法的C的程序在C++中都是合法的!C++中扩展了很多内容数据类型:引用、类类型、布尔类型等!关键字:friend、class、bool、public等! 编程思想是不一样的C语言是面向过程的结构化的程序设计语言,中级语言。C++是面向对象的编程语言,更接近自然界的发展规律!解决问题:解决命名冲突的问题!变量、函数、自定义的数据类型命名空间格式: namespace 命名空间的名字{可以有变量,也可以有函数,还可以有自定义的数据类型};

qq_59557128的博客 3015

C++教程从入门到实战

C++基础教程 一、数据类型 1.1、第一个C++程序 1.2、数据类型 1.3、常量及符号 1、整型常量:整型常量可以分为有符号整型常量和无符号整型常量 八进制:以0开头,即以0作为八进制数的前缀,每位取值范围是0~7,八进制数通常是无符号数。 例如:016、0101、0128都是合法的八进制数 十六进制:以0x或者0X开头,其数码取值范围0 ~ 9,以及A ~ F或者a ~ f 例如:0X2A1、0XC5、0XFFFF都是合法的16进制数 2、实型常量 小数表示法:由整

believer 18万+

C++初阶:C++入门

C++初阶:C++入门

weixin_36194037的博客 1813

C+_+初入学

c plus plus 简称c++

qq_53923748的博客 498

c++概念——入门基础概念

c++入门概念

2301_79705195的博客 1270

劳特巴赫 Trace32 调试使用教程

详细介绍如何使用trace32进行调试

m0_56208280的博客 4万+

c++入门(七万字心得体会!!)分上下两篇(初阶+进阶)

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。// bit是命名空间的名字,一般开发中是用项目名字做命名空间名。// 我们上课用的是bit,大家下去以后自己练习用自己名字缩写即可,如张三:zs// 1. 正常的命名空间定义// 命名空间中可以定义变量/函数/类型int val;//2. 命名空间可以嵌套int a;int b;int c;int d;

weixin_73861555的博客 1552

配电变压器测控终端装置设计

配电变压器测控终端装置在电网运行中承担着数据采集、状态监测、故障预警及远程控制的关键任务,其性能直接关系到配电系统的安全性与可靠性。本研究围绕测控终端的硬件电路、软件算法、通信系统及系统优化展开深入分析,并基于实验测试验证系统性能。硬件设计包括模拟量输入电路、电压电流信号变换电路、A/D转换电路、控制与通信电路及系统电源电路,确保信号采集的高精度与系统的稳定性。软件部分涵盖系统控制程序、数据采集与处理程序、通信程序及显示与控制程序,实现数据的实时处理与传输。通信模块结合RS-485、CAN总线及以太网技术,

weixin_44553616的博客 1102

C++初阶学习第二弹——C++入门(下)

C++入门学习(下),刚开始学习C++的小伙伴建议看一下,一方面学习一下,另一方面查漏补缺,非常详细!!!

2301_80220607的博客 4968

Windows防火墙服务异常修复指南:0x80070422与0x6D9报错实战处理

本文针对Windows防火墙服务异常导致的0x80070422与0x6D9报错,提供了从基础到进阶的实战修复指南。核心是通过services.msc服务管理器检查并修复Windows Firewall服务,包括设置启动类型、检查依赖服务等关键步骤。同时介绍了当基础方法失效时,如何使用命令行工具、系统文件检查器(SFC/DISM)以及排查组策略与第三方软件冲突等深度解决方案,帮助用户彻底解决防火墙服务无法启动或访问的问题。

m9n0o的博客 542

802.1x之EAP-TLS测试方法

CA证书一般是由权威的认证机构发出,用来验证该机构签名的证书,持有CA证书的设备可以验证对端的证书是否由自己信任的机构颁发的。在我们内部使用证书时,我没可以自己充当CA认证机构,管理私钥和CA证书,使用他们签名服务器、客户端证书。2、使用证书请求文件server_csr.pem、CA私钥、CA公钥生成服务器证书(正常情况下自己不拥有CA私钥,是把证书请求文件发给认证机构,由认证机构返回证书)进行802.1x EAP-TLS认证时需要IPC、服务器分别存储CA证书、设备证书、私钥,通过交换证书实现身份验证。

写作是为了更好的思考 2162

CPP初阶入门基础

本文摘要: C++基础语法要点解析:1) C++与C语言的异同:C++支持面向对象特性、异常处理机制和STL标准库;2) 命名空间(namespace)的作用与用法,解决命名冲突问题;3) 缺省参数的定义规则与使用场景;4) 函数重载的实现条件与限制;5) 引用的概念、特性及应用场景;6) 内联函数(inline)的优化原理;7) nullptr替代NULL的优势。通过代码示例展示了C++特有的语法特性及其实际应用价值。

2302_80630445的博客 1261

Windows10内核逆向-2-KiSystemCall64的调用流程剖析

本文深入剖析了Windows 10 x64系统中KiSystemCall64函数的完整调用流程。从用户态触发syscall指令开始,详细讲解了如何通过swapgs切换内核栈、构建KTRAP_FRAME陷阱帧、进行SMAP/CFG等安全检查,到最终通过SSDT寻址并执行目标系统服务的全过程,揭示了系统调用从Ring 3到Ring 0切换的核心机制与安全设计。

weixin_29209805的博客 82

Cpp入门基础

定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中 即为命名空间的成员。命名空间中可以定义变量/函数/类型等。namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下 ⾯的rand不在冲突了。C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。

2401_86658278的博客 5100

【mip-NeRF】使用一组二维图像渲染3D场景视频(mip-NeRF论文复现)

本文对mip-NeRF模型的pytorch实现进行了复现

Ryan2k的博客 1841

提示工程ROI计算模板:架构师私藏Excel表(含自动计算)

花3个人力优化提示词,到底能带来多少实际收益?“这个提示工程项目值得做吗?投入10万成本,多久能回本?“不同LLM应用的提示词优化优先级怎么排?全凭经验拍脑袋?当前90%的企业在提示工程投入上缺乏标准化的量化评估方法,导致资源浪费(盲目投入无回报项目)或错失机会(低估高价值优化点)。ROI = (总收益 - 总成本) / 总成本 × 100%对于提示工程,总成本=显性成本+隐性成本,总收益=直接收益+间接收益(后文会详细拆解)。提示工程的价值不是“玄学”,而是可以用数据量化的投资行为。本文分享的。

AI开发架构师 1073

【C++初阶】C++入门

C++是脱胎于C语言的,所以也包含了C语言绝大多数的内容,C++兼容C语言绝大多数的语法,在C语言中能实现的程序在C++中也是可以执行的,但需要将定义文件代码的后缀改为.cpp就比如hello world程序 但在C++中,它是自成体系的,有自己的输入输出 c++版的hello world程序为 初学C++的小伙伴出看见这个代码会有很多疑惑,但不要慌张,接下来让我来为你详细解释 2、命名空间:namespace 在看很多书上的C++代码都很看到这样的一行代码“using namespace st

twlw13的博客 1524

cartographer运行错误集合

播放bag的时候错误 Check failed: sensor_to_tracking->translation().norm() < 1e-5 The IMU frame must be colocated with the tracking frame. Transforming linear acceleration into the tracking frame will otherwise be imprecise tracking frame不是imu的link 修改lua文件中的.

Studying…… 2017

[cpp初阶]C++入门

文章目录命名空间命名空间定义命名空间的使用C++输入输出缺省函数缺省函数分类函数重载函数重载概念函数名修饰规则extern "C"引用引用概念引用特性常引用使用场景引用和指针的区别内联函数概念特性auto关键字(C++11)auto简介auto的使用细则auto不能推导的场景基于范围的for循环(C++11)范围for的语法范围for的使用条件指针空值nullptr(C++11)C++98中的指针空值 命名空间 在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局

weixin_53027918的博客 669

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【C++初阶】第一站:C++入门基础(下)

本章知识点包括:引用和指针的区别、内联函数、auto关键字(C++11)、基于范围的for循环(C++11)、指针空值nullptr(C++11)等补充知识。

weixin_65186652的博客 5389

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【C++初阶】小白入门C++

从本篇文章开始就正式进入C++的学习了,C++在C语言的基础上增加了面向对象的思想,还有许多库,在使用上相比C语言大大提高了效率,同时在语法上也填上C语言的坑。本篇文章是介绍C++入门的基础语法知识,接下来我们一起往下看吧~在C++中,允许同一作用域中出现名字相同但类型/参数个数/类型顺序不同的函数,这类函数叫做重载函数。常用来解决功能类似数据类型不同的问题。return 0;Add(6);

2301_77459845的博客 1128

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【初阶C++】入门基础

C++ 作为一门兼具面向对象特性与底层高性能的经典编程语言,至今仍是工业界核心开发语言之一,深耕游戏引擎、音视频、嵌入式、服务器、操作系统等高端技术领域。很多初学者觉得 C++ 晦涩难学、学习曲线陡峭,其实只要理清发展脉络、找准学习方向、吃透基础语法,就能稳步入门。本文基于 C++ 入门基础学习资料,系统梳理C++ 发展历史、标准版本迭代、行业地位、就业应用、学习规划,并详解命名空间、IO 流、缺省参数、函数重载、引用、内联函数、nullptrC 语言NULL本质是宏,可能被定义为 0 或。

wuqingyigexiaoba的博客 1322

C++初阶——入门

• 定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。命名空间中可以定义 变量 / 函数 / 类型 等。• namespace本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand不在冲突了。• C++中域有 函数局部域,全局域,命名空间域,类域。域影响的是编译时语法查找一个 变量 / 函数 / 类型 出处(声明或定义)的逻辑,所以有了域隔离,名字冲突就解决了。

博客 | 复习知识点 + 练习 + 最终的领悟 | 全力以赴 1375

C++初阶—C++入门

在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它。auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。int a = 0;auto b = a;//auto根据右边的值自动推导左边的类型//c是int*//d是a的引用//普通场景没有什么价值//类型很长,就有价值,简化代码//上方代码简化后//查看类型【注意】

Awkwardx的博客 838

【CPP】C++模板:初阶到进阶语法与实用编程示例

探索C++模板的深度与广度,《C++模板:初阶到进阶语法与实用编程示例》带您从基础语法起步,逐步深入到高级特性。本博客结合精炼的理论知识和丰富的代码实例,揭示模板编程的精髓,助您提升开发效率,优化代码结构。无论您是初学者还是资深开发者,都能在这里找到提升C++编程技能的宝贵资源。

BinaryWiker的博客 1380

【C++初阶】C++简单入门

【C++初阶】C++简单入门(长期维护)

BinaryWiker的博客 1527
上一篇: C++初阶 —— 简介
下一篇: C++初阶 —— 类与对象(一)
挨代码
博客等级 码龄5年 1696粉丝 384原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值