菜鸟C++自学笔记【包含函数的结构】

简介:

C++给结构增加了一种新成员类型-------在C++中,结构可以包含函数,这意味着通过给结构增加函数,就使结构可以包含所绑定的算法,而这些算法还可作于其他结构成员。让算法与算法处理的数据密切关联,这种关联就是C++支持封装的方式。

如下提供一段为结构增加函数的代码:

 

#include  " stdafx.h "
#include 
< iostream >


struct  Date{
    
int  month,day,year;
    
void  display(); 
};
 
void  Date::display(){
    
static   char *  mon[] = {
        
" January " , " February " , " March " , " April " , " May "
            ,
" June " , " July " , " August " , " Setember " , " October " , " November " , " December "
    };
    std::cout
<< mon[month - 1 ] << "    " << day << " , " << year << " \n " ;
}
 

int  main( int  argc,  char *  argv[])

    Date birthday
= { 4 , 6 , 1961 };
    std::cout
<< " terry is date birth is  " ;
    birthday.display();
    
return   0 ;
}

 

 

以上程序代码,把类声明外的display函数声明记做Date::display。这种写法告诉C++编绎器,存在支持Date 结构实例的显示成员函数。事实上,只有己声明的Date 的结构成员才能调用这个显示函数。

程序中的main 函数声明一个名为birthday的Date 实例,并让其初始化。然后,main 函数调用Date::display函数,把它看成birthday变量的结构成员,写法如下:

birthday.display();

Date::display 函数可以直接引用结构中其他相关成员,而不必在成员名前加上结构的实例名,因为函数本身就是结构成员。Date::display 函数还声明了一个指向字符串数组的指针数组,它用字符串初始化。

TIP:实现结构函数体的函数名必须与结构类型一致。

运行效果如下:

 

上面的代码我们还可以在main 函数里面声明同一结构的多个实例,在为某个特定结构对象调用函数时,成员函数把自己与对象的数据关联起来。代码如下:

 

#include  " stdafx.h "
#include 
< iostream >


struct  Date{
    
int  month,day,year;
    
void  display(); 
};
 
void  Date::display(){
    
static   char *  mon[] = {
        
" January " , " February " , " March " , " April " , " May "
            ,
" June " , " July " , " August " , " Setember " , " October " , " November " , " December "
    };
    std::cout
<< mon[month - 1 ] << "    " << day << " , " << year << " \n " ;
}
 

int  main( int  argc,  char *  argv[])

    Date birthday
= { 4 , 6 , 1961 };
    std::cout
<< " terry is date birth is  " ;
    birthday.display();


    Date sharons_birthday
= { 10 , 12 , 1988 };
    std::cout
<< " Share's date of birthday " ;
    sharons_birthday.display();


    Date wndys_birthday
= { 4 , 28 , 1999 };
    std::cout
<< " wndy's date of birth is  " ;
        wndys_birthday.display();
    
return   0 ;
}

 

 

运行效果如下:

 

 

新手初学,还有很多不懂,请各位大侠赐教。


 本文转自 terry_龙 51CTO博客,原文链接:http://blog.51cto.com/terryblog/405797,如需转载请自行联系原作者



相关文章
|
3月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
84 0
|
6月前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
324 6
|
11月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
11月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
427 6
|
11月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
103 3
|
11月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
151 0
C++ 多线程之线程管理函数
|
11月前
|
安全 编译器 C++
【C++篇】C++类与对象深度解析(三):类的默认成员函数详解
【C++篇】C++类与对象深度解析(三):类的默认成员函数详解
78 3
|
11月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
1879 1
|
11月前
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
135 1
|
11月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
171 0
C++入门6——模板(泛型编程、函数模板、类模板)