C++中const和template的用法
CC++中CONST用法总结(推荐)

CC++中CONST⽤法总结(推荐)1、修饰常量时:const int temp1; //temp1为常量,不可变 int const temp2; //temp2为常量,不可变2、修饰指针时: 主要看const在*的前后,在前则指针指向的内容为常量,在后则指针本⾝为常量;const int *ptr; //*ptr为常量; int const *ptr; //*ptr为常量; int* const ptr; //ptr为常量; const int * const ptr; //*ptr、ptr均为常量;3、const修饰类对象时: const修饰类对象时,其对象中的任何成员都不能被修改。
const修饰的对象,该对象的任何⾮const成员函数都不能调⽤该对象,因为任何⾮const成员函数都会有修改成员变量的可能。
class TEMP{ void func1(); void func2() const; } const TEMP temp; temp.func1(); //错误; temp.func2(); //正确;4、const修饰成员变量: const修饰的成员变量不能被修改,同时只能在初始化列表中被初始化,因为常量只能被初始化,不能被赋值; 赋值是使⽤新值覆盖旧值构造函数是先为其开辟空间然后为其赋值,不是初始化;⽽初始化列表开辟空间和初始化是同时完成的,直接给与⼀个值,所以const成员变量⼀定要在初始化列表中完成。
class TEMP{ const int val; TEMP(int x)val(x){}; //只能在初始化列表中赋值; }5、const修饰类的成员函数 const成员函数表⽰该成员函数不能修改类对象中的任何⾮const成员变量。
⼀般const写在函数的后⾯,形如:void func() const; 如果某个成员函数不会修改成员变量,那么最好将其声明为const,因为const成员函数不会对数据进⾏修改,如果修改,编译器将会报错;class TEMP{ void func()const; //常成员函数,不能修改对象中的成员变量,也不能调⽤类中任何⾮const成员函数; } 对于const类对象,只能调⽤类中的const成员函数,所以const修饰成员函数的作⽤主要就是限制对const对象的使⽤。
const的五种用法

const的五种用法包括:
1. const修饰变量,即常量。
这种常量在定义时,修饰符const可以用在类型说明符前,也可以用在类型说明符后。
2. const修饰指针,常用来限制指针所指向的内容不被修改。
有两种情况:const char * p或char const *p,p指向的内容(*p)不能修改;char* const p,表示p不能改变,但是p指向的内容(*p)可以改变。
3. const修饰函数,有三种情况:const修饰返回值(放在最前),表示返回的值不能修改;const修饰形参(中间位置),表示在函数体内,该形参不能修改;const修饰函数(放在最后),该形式只用于成员函数,表示函数内,成员变量不能修改。
4. const修饰对象,const对象只能调用const成员函数,不能调用普通函数。
非const对象,既可以调用普通成员函数,也可以调用const成员函数。
5. 用来声明常类型,常类型的变量或对象的值是不能被更新的。
定义或说明常类型时必须进行初始化。
以上就是const的五种用法,在使用时需要根据实际需求进行选择。
模板template用法

模板template⽤法模板(Template)指C++程序设计设计语⾔中采⽤类型作为参数的程序设计,⽀持通⽤程序设计。
C++ 的标准库提供许多有⽤的函数⼤多结合了模板的观念,如STL以及IO Stream。
参考:函数模板定义⼀族函数。
//template1.cpp #include <iostream>template<typename T> void swap(T &a, T &b) {T tmp{a}; a = b;b = tmp;}int main(int argc, char* argv[]){int a = 2; int b = 3;swap(a, b); // 使⽤函数模板std::cout << "a=" << a << ", b=" << b << std::endl;double c = 1.1; double d = 2.2; swap(c, d);std::cout << "c=" << c << ", d=" << d << std::endl;return 0;}函数模板的格式:template<parameter-list> function-declaration函数模板在形式上分为两部分:模板、函数。
在函数前⾯加上 template<...>就成为函数模板,因此对函数的各种修饰(inline、constexpr 等)需要加在 function-declaration 上,⽽不是 template 前。
如templateinline T min(const T &, const T &);parameter-list 是由英⽂逗号(,)分隔的列表,每项可以是下列之⼀:上⾯ swap 函数模板,使⽤了类型形参。
const的用法

const的用法在程序设计中,我们经常会用到const关键字,它用于定义常量,即一旦被定义,其值就不能被修改。
const的使用可以使程序更加安全、可维护、易理解。
本文将介绍const的用法及其在不同场合下的应用。
一、const的定义与声明const关键字用于定义常量,一旦被定义,其值就不能被修改。
常量可以用于多种情况,如表示数值、字符串、地址等。
const的定义方法如下:const 类型说明符常量名 = 常量值;例如:const int MAX_NUM = 100;const char* STR = 'Hello World!';在定义常量时,我们可以使用const修饰符来声明一个变量为常量。
例如:const int MAX_NUM = 100;在这个例子中,MAX_NUM被声明为一个常量,其值为100,不能被修改。
二、const的作用1.保护变量不被修改const关键字可以保护变量不被修改,从而避免了因修改变量值而引起的错误。
例如:const int MAX_NUM = 100;MAX_NUM = 200; // 编译错误2.提高代码的可读性和可维护性使用const关键字可以提高代码的可读性和可维护性。
常量的值是固定的,不会被修改,这样可以使代码更加清晰、易懂。
例如: const int MAX_NUM = 100;...if (a > MAX_NUM) {...}在这个例子中,MAX_NUM表示最大值,如果代码中直接使用100,可能会让人感到困惑,但是使用MAX_NUM则可以让代码更加易懂。
3.避免重复定义使用const关键字可以避免重复定义。
如果多个文件中都定义了同名的常量,那么在链接时就会出现重复定义的错误。
使用const关键字可以避免这种情况的发生。
例如:// file1.cppconst int MAX_NUM = 100;// file2.cppextern const int MAX_NUM;在这个例子中,file1.cpp中定义了常量MAX_NUM,file2.cpp 中使用extern关键字声明MAX_NUM,这样就可以避免重复定义的错误。
C++Template基础篇(一):函数模板详解

C++Template基础篇(⼀):函数模板详解Template所代表的泛型编程是C++语⾔中的重要的组成部分,我将通过⼏篇blog对这半年以来的学习做⼀个系统的总结,本⽂是基础篇的第⼀部分。
为什么要有泛型编程C++是⼀门强类型语⾔,所以⽆法做到像动态语⾔(python javascript)那样⼦,编写⼀段通⽤的逻辑,可以把任意类型的变量传进去处理。
泛型编程弥补了这个缺点,通过把通⽤逻辑设计为模板,摆脱了类型的限制,提供了继承机制以外的另⼀种抽象机制,极⼤地提升了代码的可重⽤性。
注意:模板定义本⾝不参与编译,⽽是编译器根据模板的⽤户使⽤模板时提供的类型参数⽣成代码,再进⾏编译,这⼀过程被称为模板实例化。
⽤户提供不同的类型参数,就会实例化出不同的代码。
函数模板定义把处理不同类型的公共逻辑抽象成函数,就得到了函数模板。
函数模板可以声明为inline或者constexpr的,将它们放在template之后,返回值之前即可。
普通函数模板下⾯定义了⼀个名叫compare的函数模板,⽀持多种类型的通⽤⽐较逻辑。
template<typename T>int compare(const T& left, const T& right) {if (left < right) {return -1;}if (right < left) {return 1;}return 0;}compare<int>(1, 2); //使⽤模板函数成员函数模板不仅普通函数可以定义为模板,类的成员函数也可以定义为模板。
class Printer {public:template<typename T>void print(const T& t) {cout << t <<endl;}};Printer p;p.print<const char*>("abc"); //打印abc为什么成员函数模板不能是虚函数(virtual)?这是因为c++ compiler在parse⼀个类的时候就要确定vtable的⼤⼩,如果允许⼀个虚函数是模板函数,那么compiler就需要在parse这个类之前扫描所有的代码,找出这个模板成员函数的调⽤(实例化),然后才能确定vtable的⼤⼩,⽽显然这是不可⾏的,除⾮改变当前compiler的⼯作机制。
函数参数const的用法详解

函数参数const的用法详解摘要:1.函数参数const 的概述2.const 参数的初始化3.const 参数的优点4.const 参数的注意事项5.const 参数的示例正文:【1.函数参数const 的概述】在C++编程语言中,const 是一种关键字,用于声明常量。
在函数参数中使用const 关键字,可以限制函数对参数的修改,提高代码的安全性和稳定性。
【2.const 参数的初始化】当函数参数被声明为const 时,该参数在函数调用时只能被初始化,不能在函数内部进行修改。
这有助于防止在函数中误修改参数,从而降低程序出错的风险。
【3.const 参数的优点】const 参数有以下优点:- 提高代码的安全性:const 参数可以防止程序员在函数内部误修改参数,避免出现意外的错误。
- 代码可读性:const 参数使得函数的签名更加清晰,易于理解。
- 代码可维护性:const 参数有助于保持函数的功能不变,便于后续维护和修改。
【4.const 参数的注意事项】在使用const 参数时,应注意以下几点:- const 参数只能被初始化,不能在函数内部修改。
如果需要在函数内部修改参数,请不要将其声明为const。
- const 参数可以提高代码的安全性,但并不能保证代码绝对安全。
还需要程序员具备扎实的编程基础和严谨的编程态度。
- const 参数适用于值传递的参数,不适用于指针传递的参数。
对于指针传递的参数,可以使用指针常量来实现类似的功能。
【5.const 参数的示例】以下是一个使用const 参数的函数示例:```cpp#include <iostream>void print_const_value(const int value) {std::cout << "The constant value is: " << value << std::endl;}int main() {int num = 10;print_const_value(num);// print_const_value(num + 1); // 编译错误,因为num 是const 参数,不能在函数内部修改return 0;}```在这个示例中,`print_const_value`函数的参数`value`被声明为const int,表示该参数在函数调用时只能被初始化,不能在函数内部进行修改。
CPP语法总结

C++语法总结(一)1. I/O流的常用控制符dec 置基数为10hex 置基数为16oct 置基数为8setfill(c) 设填充字符为Csetprecision(n) 设显示小数精度为n位setw(n) 设域宽为N个字符setiosflags(ios::fixed) 固定的符点显示setiosflags(ios::scientific)指数表示setiosflags(ios::left) 左对齐setiosflags(ios::right) 右对齐setiosflags(ios::skipws) 忽略前导空白setiosflags(ios::uppercase) 16进制数大写输出setiosflags(ios::lowercase) 6进制数小写输出setiosflags(ios::showpoint) 显示小数点setiosflags(ios::showpos) 正数前面加上正号2.头文件:*iostream.h* *iomanip.h* *stdlib.h*cout/cin 流的控制符 exit(0)3.指针的几种类型:int (*p)();p为指向函数的指针变量,该函数带回一个整形值int *p();p为带回一个指针的函数,该指针指向整形数据int (**)[n]p为一个指向一个指针变量的指针变量,被指向的指针变量指向一个含n个整形数据的一维数组4.构造函数和析构函数特点及其区别:a.构造函数可以有任意个形参,还可以重载(多个参数个数不同的函数);但析构函数不能有形参,因为是系统自动调用的.b.构造函数不可以任意调用,只准系统调用;而析构函数不仅系统调用,也可以任意调用.5.构造函数和析构函数什么时候自动运行?(例61)构造函数:一般在定义类对象时自动运行.析构函数:如果一个函数中定义了一个对象,则在这个函数运行结束时就执行一次;当一个对象是使用NEW运算符被动态创建的,在使用DELETE运算符释放它时,DELETE将会自动调用析构函数.拷贝初始化构造函数:当用tpoint N(M);语句时调用一次;当对象作为实参向形参传递时,即对形参初始化时执行一次;当遇到M=return(N);语句,即对M进行初始化时调用一次;6. this 指针用法:例63中,当程序执行语句list elem(i);时,系统对this指针进行了如下的缺省赋值:this=&list;赋值成员函数举例(此例在例63基础上):void Assign(linear_list&);//说明语句;void linear_list::Assign(linear_list&p){if(&p==this)return;nmax=p.nmax;nelem=p.nelem;list=new int[nmax];for(int i=0;i<nmax;i++)list[i]=p.list[i];}7.const,volatile对象和const,volatile成员函数格式:const person per/volatile person per;int func(int) const;/char func(int) volatile;说明:1.普通对象既可以访问const对象,又可以访问volatile对象;2.const对象只能访问用const修饰的成员函数;volatile对象只能访问用其所长volatile修饰的成员函数;3.也可以同时说明为const volatile对象或const volatile成员函数;const volatile对象只能访问const volatile成员函数;const/volatile对象也能访问const volatile成员函数;8.不同继承方式的基类和派生类特性------------------------------------------------继承方式 | 基类特性 | 派生类特性------------------------------------------------| public | public公有继承 | protected | protected| private | 不可访问------------------------------------------------| public | private私有继承 | protected | private| private | 不可访问------------------------------------------------| public | protected保护继承 | protected | protected| private | 不可访问------------------------------------------------A:帮助理解:1)对于公有继承方式:a.基类成员对其对象的可见性:公有成员可见,其他不可见。
函数参数const的用法详解

函数参数const的用法详解摘要:1.函数参数const的概述2.const的定义和特点3.const在函数参数中的用法4.const在函数参数中的实际应用5.const在函数参数中的优缺点分析6.总结正文:【1.函数参数const的概述】在C语言中,const关键字可以用于修饰变量和函数参数,以表示该变量或参数的值在程序执行过程中不会被修改。
在函数参数中使用const可以带来代码的可读性和可维护性的提升,同时也有助于减少程序出错的可能性。
【2.const的定义和特点】const定义的变量或参数是一个只读的,意味着它的值不能被修改。
一旦const变量被初始化,它的值就不能再被改变。
在函数中使用const参数,可以防止在函数内部误修改参数的值,从而提高代码的可靠性。
【3.const在函数参数中的用法】在函数参数中使用const主要有以下两种方式:(1)在函数声明时使用const修饰参数:例如,`void func(const int a)`,这样定义的函数参数a是一个只读参数,不能在函数内部被修改。
(2)在函数定义内部使用const修饰参数:例如,`void func(int a) { const int b = a; }`,这样定义的函数参数a是一个普通参数,但在函数内部被定义为const,因此它的值也不能被修改。
【4.const在函数参数中的实际应用】在实际编程中,const在函数参数中的应用十分广泛。
例如,当需要实现一个计算两个数之和的函数时,可以使用const来确保函数参数的值不被修改:```c#include <stdio.h>void add(const int a, const int b) {int sum = a + b;printf("The sum of %d and %d is %d", a, b, sum);}int main() {add(1, 2);add(3, 4);return 0;}```在这个例子中,函数add的参数a和b都被定义为const,因此在函数内部不能修改它们的值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、C中的CONSTCONSTconst是一个C语言的关键字,它限定一个变量不允许被改变。
使用const在一定程度上可以提高程序的安全性和可靠性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。
另外CONST在其他编程语言中也有出现,如C++、PHP5、C#.net、HC08 C。
C中CONST的使用:虽然这听起来很简单,但实际上,const的使用也是c语言中一个比较微妙的地方,微妙在何处呢?请看下面几个问题。
问题:const变量 & 常量为什么下面的例子在使用一个const变量来初始化数组,ANSI C的编译器会报告一个错误呢?const int n = 5;int a[n];答案与分析:1)、这个问题讨论的是“常量”与“只读变量”的区别。
常量肯定是只读的,例如5, "abc",等,肯定是只读的,因为常量是被编译器放在内存中的只读区域,当然也就不能够去修改它。
而“只读变量”则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改。
C语言关键字const就是用来限定一个变量不允许被改变的修饰符(Qualifier)。
上述代码中变量n被修饰为只读变量,可惜再怎么修饰也不是常量。
而ANSI C规定数组定义时长度必须是“常量”,“只读变量”也是不可以的。
2)、注意:在ANSI C中,这种写法是错误的,因为数组的大小应该是个常量,而const int n,n只是一个变量(常量 != 不可变的变量,但在标准C++中,这样定义的是一个常量,这种写法是对的),实际上,根据编译过程及内存分配来看,这种用法本来就应该是合理的,只是 ANSI C对数组的规定限制了它。
3)、那么,在ANSI C 语言中用什么来定义常量呢?答案是enum类型和#define宏,这两个都可以用来定义常量。
问题:const变量 & const 限定的内容下面的代码编译器会报一个错误,请问,哪一个语句是错误的呢?typedef char * pStr;char string[4] = "abc";const char *p1 = string;const pStr p2 = string;p1++;p2++;答案与分析:问题出在p2++上。
1)、const使用的基本形式: const char m;限定m不可变。
2)、替换1式中的m, const char *pm;限定*pm不可变,当然pm是可变的,因此问题中p1++是对的。
3)、替换1式char, const newType m;限定m不可变,问题中的charptr就是一种新类型,因此问题中p2不可变,p2++是错误的。
问题:const变量 & 字符串常量请问下面的代码有什么问题?char *p = "i'm hungry!";p[0]= 'I';答案与分析:上面的代码可能会造成内存的非法写操作。
分析如下, "i'm hungry"实质上是字符串常量,而常量往往被编译器放在只读的内存区,不可写。
p 初始指向这个只读的内存区,而p[0] = 'I'则企图去写这个地方,编译器当然不会答应。
问题:const变量 & 字符串常量2请问char a[3] = "abc" 合法吗?使用它有什么隐患?答案与分析:在标准C中这是合法的,但是它的生存环境非常狭小;它定义一个大小为3的数组,初始化为"abc",注意,它没有通常的字符串终止符'\0',因此这个数组只是看起来像C语言中的字符串,实质上却不是,因此所有对字符串进行处理的函数,比如strcpy、printf等,都不能够被使用在这个假字符串上。
问题5:const & 指针类型声明中const用来修饰一个常量,有如下两种写法,那么,请问,下面分别用const限定不可变的内容是什么?1)、const在前面const int nValue; //nValue是constconst char *pContent; //*pContent是const, pContent可变const (char *) pContent;//pContent是const,*pContent可变char* const pContent; //pContent是const,*pContent可变const char* const pContent; //pContent和*pContent都是const2)、const在后面,与上面的声明对等int const nValue; // nValue是constchar const * pContent;// *pContent是const, pContent可变(char *) const pContent;//pContent是const,*pContent可变char* const pContent;// pContent是const,*pContent可变char const* const pContent;// pContent和*pContent都是const 答案与分析:const和指针一起使用是C语言中一个很常见的困惑之处,在实际开发中,特别是在看别人代码的时候,常常会因为这样而不好判断作者的意图,下面讲一下我的判断原则:(这个规则是错的)(因为“()”的出现,使得这个规则有时候是不成立的。
)沿着*号划一条线,如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于*的右侧,const 就是修饰指针本身,即指针本身是常量。
你可以根据这个规则来看上面声明的实际意义,相信定会一目了然。
另外,需要注意:对于const (char *) ; 因为char *是一个整体,相当于一个类型(如 char),因此,这时限定指针是const。
2、C++中CONSTCONST(一)简单介绍,把握全局const与define,指针,引用,函数,类成员1.》》const与define。
两者都可以用来定义常量,但是const定义时,定义了常量的类型,所以更精确一些。
#define只是简单的文本替换,除了可以定义常量外,还可以用来定义一些简单的函数,有点类似内置函数。
const和define定义的常量可以放在头文件里面。
(小注:可以多次声明,但只能定义一次)2.》》const与指针和引用。
(a)const与指针。
先来看看下面的几种定义:int me;const int * p1=&me;//p1可变,*p1不可变,但是不能用*p1来修改,p1可以转向int * const p2=&me;//p2不可变,*p2可变,此时允许*p2来修改其值,但是p2不能转向。
const int *const p3=&me;//p3不可变,*p3也不可变,此时既不能用*p3来修改其值,也不能转向(b)指针和引用的区别很简单,就是引用更简洁,更安全。
因为引用声明是必须初始化。
引用更接近const指针,一旦与某个变量关联,就将一直效忠于他。
(c)const指针可以接受const和非const地址,但是非const指针只能接受非const地址。
所以const指针的能力更强一些,所以尽量多用const指针,这是一种习惯。
3.》》(a)const与函数。
由于 c,所以经常把函数的形参类型设为const,而且多为const 引用。
但是这里有一个限制,不能把不是左值的地址传递给引用。
(左值包括变量,数组元素,结构成员,引用,被解除引用的指针等)。
形参是const类型的,说明该函数将不会修改其值,该函数便为const函数。
(b)const与类成员函数。
先看看下面这段代码:const Stock land =Stock("hyd");land.show();land 是常量,但是类成员函数show无法保证不修改land,所以编译器将拒绝执行该段代码。
除非你能保证show像const函数一样,但这需要另外一种语法,即:void show() const;(声明)void Stock::show() const{}(定义)。
(二)详细介绍,注重细节C中常用:“ #define 变量名变量值”定义一个值替代,然而却有个致命缺点:缺乏类型检测机制,这样预处理在C++中成为可能引发错误的隐患,于是引入const.const使用:1. 用于指针的两种情况:const是一个左结合的类型修饰符.int const *A; //A可变,*A不可变int *const A; //A不可变,*A可变2.限定函数的传递值参数:void function(const int Var); //传递过来的参数在函数内不可以改变.3.限定函数返回值型.const int function(); //此时const无意义const myclassname function(); //函数返回自定义类型myclassname.4限定函数类型.void function()const; //常成员函数, Const成员函数不能改变对象的成员函数。
例如:int Point::GetY(){return yVal;}这个函数被调用时,不改变Point对象,而下面的函数改变Point对象:void Point:: SetPt (int x, int y){xVal=x;yVal=y;}为了使成员函数的意义更加清楚,我们可在不改变对象的成员函数的函数原型中加上const说明:class Point{public:int GetX() const;int GetY() const;void SetPt (int, int);void OffsetPt (int, int);private:int xVal, yVal;};const成员函数应该在函数原型说明和函数定义中都增加const限定:int Point::GetY() const{return yVal;}class Set {public:Set (void){ card = 0; }bool Member(const int) const;void AddElem(const int);//...};bool Set::Member (const int elem) const{//...}非常量成员函数不能被常量成员对象调用,因为它可能企图修改常量的数据成员:const Set s;s.AddElem(10); // 非法: AddElem不是常量成员函数s.Member(10); // 正确*******但构造函数和析构函数对这个规则例外,它们从不定义为常量成员,但可被常量对象调用(被自动调用)。