C/C++ 函数模板、全局变量、register、存储周期

1.函数声明时可以简写,如:

int max(int,int);

2.函数模板:

格式:

template <typename haha>
或template <class haha>
typename、class为关键字,class也是指函数而非类。
e.g.
   template <typename haha>
   haha max(haha a,haha b)
   {
       //xxxxx
   }

调用时像调用正常函数一样就行,会根据参数自行重载适合的函数类型。

3.有默认参数的函数:

int length(int l=10);
调用时,
可以length();//l=10;
也可以length(53);//l=53;

若有多个参数,则指定默认值的参数必须在最右端。

4.变量存储属性:

变量存储期指的是变量在内存中存在的周期,即时间起始。

内存中存储空间细分的话可分为5部分,即栈区、堆区、全局区、文字常量区、程序代码区。其中堆区、栈区为动态区,全局区为静态区。

a、栈区:由编译器自动分配释放,存放函数的参数值,局部变量的值等。
      b、堆区:一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
      c、全局区:全局变量和静态变量的存储是放在一块的,程序结束后由系统释放。
      d、文字常量区:常量字符串就是放在这里的。 程序结束后由系统释放。
      e、程序代码区:存放函数体的二进制代码。

e.g.

//main.cpp
int a = 0;          // 全局初始化区
char *p1;           // 全局未初始化区
main()
{
  int b;                   // 栈区
  char s[] = "abc"; // 栈区
  char *p2;            // 栈区
  char *p3 = "123456";     // "123456/0" 在常量区,p3在栈区
  static int c =0;               // 全局(静态)初始化区
 
  p1 = (char *)malloc(10);
  p2 = (char *)malloc(20); // 分配得来的10和20字节的区域就在堆区
 
  strcpy(p1, "123456");     //"123456/0" 放在常量区,编译器可能会将它
                                        //与p3所指向的"123456"优化成一个地方。
}

变量类型分为4种:auto、static、register、extern。

一般cpu要用哪个数据时,就从内存中把它取出来,包括动态和静态。但是对于有些使用频繁的数据还行速度不够,所以有了register。register就是寄存器变量,将数据存在cpu的寄存器中,而不是内存中,效率更高了。

e.g. 
register int i;

现在的编译器可以自动识别使用频繁的变量,所以一般不用register去刻意声明,了解即可。

extern只用于声明,不定义。

时间: 2024-08-23 04:22:03

C/C++ 函数模板、全局变量、register、存储周期的相关文章

【C/C++学院】0814-引用高级、引用高级增加/auto自动变量自动根据类型创建数据/Bool/Enum/newdelete全局/大数据乘法与结构体/函数模板与auto/宽字符本地化/inline

引用高级.引用高级增加 #include<iostream> #include<stdlib.h> // int a[10] // int (&ra)[10] // int a[2][5] // int (&ra)[2][5] void main1() { int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int(&ra)[10](a);//引用就是给原来的变量有一个别名同一个地址 int i = 0; for (

求变量的数据类型,typeid,bool,C和C++的不同,new和delete,C++中的枚举,inline和可变参数模板,auto和函数模板,宽字符

求变量的数据类型,通过函数typeid(变量名).name();获得变量的数据类型. 案例如下: #include <iostream> #include <stdlib.h> void main() { double db = 10.9; double *pdb = &db; auto num = pdb; //通过typeid的方式获得数据类型 std::cout << typeid(db).name() << std::endl; std::c

c++知识点总结--函数模板

通用函数可变参模板 用于处理不限定参数的函数 showall(){//空函数,接口,最后结束递归 } template<typename T,typename... Args> void showall(T value,Args ...args){ cout<<value<<endl; showall(args); } template<typename T,typename ...Args> void showall(const T &value,

函数模板特化

#include <iostream> template <typename T> T max(T x, T y) { return x > y ? x : y; } //函数模板特化 template <> const char* max(const char* x, const char* y){ return strcmp(x, y) > 0 ? x : y; } int main(){ std::cout << max(1, 2); st

C++函数模板

C++函数模板允许以任意类型的方式来定义函数.例如,可以这样建立一个交换模板: template <typename AnyType> void Swap(AnyType &a, AnyType &b) { AnyType temp; temp = a; a = b; b = temp; } 在标准C++98添加关键字typename之前,C++使用关键字class来创建模板.也就是说,可以这样编写模板定义: template <class AnyType> voi

第56课 函数模板的概念和意义

1. 发散性问题:C++中的几种交换变量的方法 (1)宏代码块 VS 函数 [编程实验]变量的交换 #include <iostream> #include <string> using namespace std; //宏定义代码块 #define SWAP(t, a, b) do { t c = a; a = b; b = c; }while(0); //定义函数方式 void Swap(int& a, int& b) { int c = a; a = b; b

函数模板友元

;函数模板友元 (即一个类友元的是一个全局函数模板而不是原先的全局函数,需注意类模板传入的类型) 标准带类模板参数 friend void fun1(A<T>& obj); 指定这个A<T>类型的模板有一个这样的朋友函数,那么也就意味着这个函数内部只能由A<T>类型的模板 实例化的类 实例化出来的对象可以访问这个对象的数据成员,不是这个类型的类模板就不能访问 ;code template<typename T> class A{ public: A(

【C/C++学院】(11)泛型编程/函数模板/类模板

1.泛型编程基础 #include "iostream" using namespace std; void swap(int &a, int &b) { int c; c = a; a = b; b = c; } void swap(float &a, float &b) { float c; c = a; a = b; b = c; } void main() { int a = 1, b = 2; swap(a, b); float a1 = 1,

函数模板的定制(字符串的比较)

#include<stdio.h> #include<iostream> #include<wchar.h> #include<cstdlib> #include<iomanip> using namespace std; template<class T>           //新定义的类型 T min3(T a, T b, T c) { T min; if(a<b && a<c) { min=a; }