王老师 C++ 函数重载和模板 第一讲

原创 2006年06月03日 18:47:00

1.const 

示例代码:

#include <iostream>
int main(void)
{
 int x = 3;
 const int y = x;
 const int *p = &y;
 const int *c = &x;

 //error: l-value specifies const object
 //*p = 5;

 //error: cannot convert from 'const int *' to 'int *'
 //int *t = &y;

 //---------------------------------------------------
 int * const px = &x;

 //error: cannot convert from 'const int *' to 'int *const '
 //px = p;

 return 0;
}

const变量主要用于函数参数,使调用者不可改变传入的指针指向的内容。

2. volatile

下面的说明来自msdn,告诉编译器,这个变量可被其他进程修改,不要对其进行优化。

Objects declared as volatile are not used in optimizations because their value can change at any time. The system always reads the current value of a volatile object at the point it is requested, even if the previous instruction asked for a value from the same object. Also, the value of the object is written immediately on assignment.

One use of the volatile qualifier is to provide access to memory locations used by asynchronous processes such as interrupt handlers.

3.引用

变量的别名,对一个变量的引用的任何操作都是对本变量操作,必须初始化。

定义语法: 类型名 &引用名 = 被引用的变量;

引用是一个指针,但不用指针的语法。

引用必须指向一个变量;引用一旦指向一个变量,即不能指向其他的变量。

4.inline将把函数代码展开,同时作类型检查,而宏则不作类型检查。

5.namespace

命名空间是累计的,可跨越文件。

给命名空间起简名: namespace 别名  = 命名空间名;

using指示符: using namespace 命名空间名;

示例代码:

#include <iostream>
using namespace std;

namespace n1
{
 int x = 1;
 int fun(int x)
 {
  cout << "in namespace 1" << endl;
  return x + 1;
 }
 namespace n2
 {
  int x = 2;
  int fun(int x)
  {
   cout << "in namespace 2" << endl;
   return x + 2;
  }
 }
}

int x = 3;
int fun(int x)
{  
 cout << "in namespace std";
 return x + 3; 
}

int g(int x)
{
 {
  using namespace n1::n2;
  int x = 4;
  return n1::n2::fun(x);
 }
}

int main(void)
{
 cout << fun(x) << endl;
 cout << n1::fun(n1::x) << endl;
 cout << n1::n2::fun(n1::x) << endl;
 cout << n1::n2::fun(n1::n2::x) << endl;
 cout << g(3);
 return 0;
}
6.函数的重载

用一个名字定义多个参数,各个参数用形参个数和类型区分。

必须在同一个命名空间中,不能用返回值区分。

示例程序:

#include <iostream>
using namespace std;

int abs(int x)
{
 return x > 0 ? x : -x;
}

double abs(double x)
{
 return x > 0 ? x : -x;
}

char abs(char x)
{
 return x > 0 ? x : -x;
}

float abs(float x)
{
 return x > 0 ? x : -x;
}

short abs(short x)
{
 return x > 0 ? x : -x;
}

long abs(long x)
{
 return x > 0 ? x : -x;
}

int main(void)
{
 double a = 3.4;

 //注释掉double类型的abs函数后
 //error: ambiguous call to overloaded function
 cout << abs(a);

 return 0;
}

<补充>
1.名字空间 完全限定名(Fully Qualified Names),两种解决方法:
(1)使用typedef 把引用序列映射为一个较短的类型名以简化书写;
(2)使用using声明和using指令
using声明语法:
using namespace::member;
or
using class::member;
using指令语法:
using namespace 名字空间名;
名字空间一般用来分隔逻辑或业务上相互独立的模块。
2.实现范型编程的方法
(1)使用带参数的宏;
(2)使用void*,例如qsort();
(3)使用通用的根类和虚函数,比如java中的Object;
(4)使用模板技术。
模板最适合实现范型编程,它不仅直观,而且是类型安全的,不会带来任何额外的运行时开销。
template-->(实例化)Classes-->(实例化)Objects
template-->(实例化)Functions
如果设计的类的行为(接口)依赖于其所操作的数据类型,那么选用模板,否则选用继承和虚函数。
3.模板实例化
两个模板类或两个模板函数是类型等价的,当且仅当下列条件同时成立:
(1)模板的名字相同;
(2)类型实参完全相同(兼容的类型为不同类型);
(3)非类型实参的值完全相等;
(4)当类型实参为另一种模板时,它们也必须相同。
模板的实例化发生在第一次使用该模板时,而不是在其定义或编译时。显式实例化由关键字template或typename后跟带模板实参的模板声明(不是定义)或类型映射组成。
4.模板的特化(specialization)
就是针对某种特别的类型参数重新实现基本的模板,一般是出于对时空效率的优化或者满足特殊的需要。例如:STL的vector<bool>。
模板特化分为显式特化(Explict Specialization)和部分特化(Particial Specialization)(vc不支持),在范型编程的traints技术中使用比较多。 

c++函数重载和函数模板

上学期学了C++,可是忘得差不多了 一、函数重载 1、函数重载挺简单的,按我的理解就是相同功能的函数可以用相同的名字,通俗点就是中文里的我能做什么,比如做饭,做菜,虽然做的东西不一样,但是...
  • u011282704
  • u011282704
  • 2014年09月24日 00:16
  • 828

王老师 C++ 函数重载和模板 第二讲

(1)连接指示符:通知编译器,某个函数是由其它语言编写的。语法:1. extern "语言名" 函数原型;2. extern "语言名" {  函数原型1;  ...  函数原型n;}3.extern...
  • nomad2
  • nomad2
  • 2006年06月10日 20:22
  • 2255

王老师 指针 第一讲

(1)概念:一块内存区域的地址两重含义:1.起始地址2.长度(2)定义语法:类型名 * 变量名;(3)指针运算指针表达式:一个表达式,值是指针.(4)指针做函数参数(5)返回函数的指针(6)指针数组示...
  • nomad2
  • nomad2
  • 2006年05月13日 17:28
  • 1634

函数重载和函数模板的区别

函数重载 通常在C语言编程中,如果我们比较三个整数的大小,我们可以进行编写一个max()函数,而如果我们要继续比较三个浮点数的大小,就需要重新编写一个函数,函数体基本是完全相同的,就是返回值和参数类...
  • zhanghuaichao
  • zhanghuaichao
  • 2016年10月10日 19:42
  • 1644

王老师 结构体 第一讲

一种数据类型,由多个分量构成,共同描述一个对象.声明语法:struct 类型名{ 分量类型1 分量名1; ... 分量类型n 分量名n;};结构型变量定义: struct 结构类型名 变量名;分配内存...
  • nomad2
  • nomad2
  • 2006年05月20日 20:36
  • 1509

C++ 函数模板(十四)--template 泛型函数模板、通用函数、重载模板

#include #include using namespace std; //函数模板,typename 等价于 class template void test(AnyType &a, A...
  • Jason_chen13
  • Jason_chen13
  • 2016年09月07日 12:01
  • 796

王老师 C++ 运算符重载 转换函数 第一讲

运算符函数:operator 运算符运算符重载,两种方式:a.成为成员函数b.名字空间函数(友元函数)不能重载的运算符有: ::, ., .*, ?:必须重载为成员函数的运算符: [], (), ->...
  • nomad2
  • nomad2
  • 2006年06月17日 21:27
  • 6511

cs231n: 第一讲

介绍 挑战 方法 Loss function OptimizationStandford的cs231n这门课,我觉得真的是太棒了。把CNN的各个部分、以及目前的发展都做了详细的介绍。同时通过作业,对C...
  • c602273091
  • c602273091
  • 2017年01月08日 17:12
  • 693

C++函数重载与重载原理:命名倾轧

一、重载概念与原则:1、重载概念:在C语言中,一个函数不能与另一个函数重名,而在C++中,只要一个函数的参数列表与另一个函数的参数列表不完全相同,函数名就可以相同。C++这一特点就是所谓函数的重载现象...
  • Apollon_krj
  • Apollon_krj
  • 2017年03月07日 13:59
  • 1135

【TomoEngine】 第五讲 【MOBA制作日记一】 角色

用TomoEngine制作一款MOBA是近期的一个计划,从一个简单的场景开始,逐步丰富场景内容。...
  • Nanhu2012
  • Nanhu2012
  • 2016年10月20日 20:46
  • 272
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:王老师 C++ 函数重载和模板 第一讲
举报原因:
原因补充:

(最多只允许输入30个字)