当前位置: 首页 > news >正文

c++类与初始化,const

--c++类与初始化,const
--------------------------------2014/09/04
1. 类的定义(头文件、声明文件)看成类的外部接口,一般写成.h头文件。
2. 类的成员函数定义(源文件)看成类的内部实现,一般写成.cpp/.cc文件。
 
--成员函数定义
  返回值 类名::函数名(参数列表) {
    函数体;
}
---------------------------------------------------
--类定义
  class 类名 {
  成员变量
  成员函数
};  --注意这里有分号,否者报错:error: new types may not be defined in a return type
--------------------------------------------------
 
看一个简单的例子:
student.h
#include<string> 
using namespace std; 
class student 
{ 
public: 
    void set_name(string v_name); 
    void set_age(int v_age); 
    void set_school_name(string v_school_name); 
    string get_name(); int get_age(); 
    string get_school_name(); 
private: 
    string name; 
    int age; 
    string school_name; };
student.cc
#include "student.h" 
void student::set_name(string v_name) 
{ name=v_name; } 
void student::set_age(int v_age) 
{ age=v_age; } 
void student::set_school_name(string v_school_name) 
{ school_name=v_school_name; } 
string student::get_name() 
{ return name; } 
int student::get_age() 
{ return age; } 
string student::get_school_name() 
{ return school_name; }
main.cc
#include<iostream>
#include "student.h" 
using namespace std; 
int main(int argc,char *argv[])
{ 
student *a=new student(); 
a->set_name("Jack"); 
a->set_age(25); 
a->set_school_name("Haford"); 
cout<<a->get_name()<<" "<<a->get_age()<<" "<<a->get_school_name()<<endl; 
} 
编译源文件
[root@localhost student]# g++ -o main main.cc student.cc   --源文件编译 
 [root@localhost student]# ./main Jack 25 Haford

构造参数的使用:
  1 #include<iostream>
  2 using namespace std;
  3 
  4 class tangle{
  5         int x;
  6         int y;
  7         public:
  8                 tangle();
  9                 tangle(int x,int y);
 10                 void set_x(int x);
 11                 void set_y(int y);
 12                 int get_x() {return x;}
 13                 int get_y() {return y;}
 14 };    --注意分号
 15 
 16 tangle::tangle() {
 17         x=0;
 18         y=0;
 19 }
 20 tangle::tangle(int x,int y) {
 21         this->x=x;    --this为指向自己的指针,不同于java的引用。
 22         this->y=y;
 23 }
 24 void tangle::set_x(int x) {
 25         this->x=x;
 26 }
 27 void tangle::set_y(int y) {
 28         this->y=y;
 29 }
 30 
 31 int main(int argc,char* argv[]) {
 32         tangle a(3,4);
 33         tangle *b=new tangle();    --new创建一个对象,返回指针
 34         cout<<"a: "<<a.get_x()<<" "<<a.get_y()<<endl;
 35         cout<<"b: "<<b->get_x()<<" "<<b->get_y()<<endl;
 36         return 0;
 37 }

类成员函数const
    一个函数名字后有const,这个函数必定是成员函数,也就是说普通函数后面不能有const修饰,如:int print( ) const {.......} 这个函数必定为成员函数,即在类里面定义的函数。
    在一个类里定义了一个const成员函数后,则此函数不能修改类中的成员变量,如果定义了一个类的const对象(非const对象可以调用const成员函数和非const成员hanshu ),它只能调用类中的const成员函数,如:
class text{
        public:
               void print_const(void) const   { cout<<"hello"<<endl;}          //有const修饰
              void print(void) {cout<<"hello"<<endl;}            //没有const修饰
             void getk(void)  const  {k=5; }          //错误,有const修饰,不能修改k的值,
      private:
             int k;
};
const text a;
int main()
{
            a.print();           //错误,const对象只能调用
           a.printf_const();   //正确
}
// void print() const {}  和 void print() {}   是重载函数,假如对象为const,则调用void print () const成员函数,如果为非const,则调用void print() ;
class text{
public:
 void print(void) const {cout<<"hello_const"<<endl;}
 void print(void) {cout<<"hello"<<endl;}
};
const text a;      
int main()
{
 a.print();    //屏幕输出 hello_const  假如对象a 定义为 text a,则输出 hello
 return 0;
}
补充:
如果const关键字不涉及到指针,我们很好理解,下面是涉及到指针的情况:         
int   b   =   500;    
const   int*   a   =   &b;              [1]    

int   const   *a   =   &b;            [2]    

int*   const   a   =   &b;              [3]    

const   int*   const   a   =   &b;   [4]     
如果你能区分出上述四种情况,那么,恭喜你,你已经迈出了可喜的一步。不知道,也没关系,我们可以参考《effective   c++》item21上的做法,如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的 右侧,const就是修饰指针本身,即指针本身是常量。因此,[1]和[2]的情况相同,都是指针所指向的内容为常量,这种情况下不允许对内容进行更改操 作,如不能*a   =   3   ;[3]为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的;[4]为指针本身和指向的内容均为常 量。 
 
 
 
 

转载于:https://www.cnblogs.com/jackhub/p/3956968.html

相关文章:

  • 想看的书
  • 一个简单实用的图片切换小例子
  • 扫描线概览
  • 模拟地与数字地(转)
  • 转函数重载之const
  • jeroMq示例之[2] [req-rep-envelopes msg identity]
  • IOS开发之 归档总结
  • 创建App IDs时选择App ID Prefix才能勾选push notifications
  • [Linux] day07——查看及过滤文本
  • TranslateAnimation详解
  • CSS编码设置篇utf-8与gb2312互转换
  • 552 you must authentication
  • 安裝PHPBB
  • ZOJ 3329 期望DP
  • C语言 21-结构体
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • css选择器
  • CSS中外联样式表代表的含义
  • k8s 面向应用开发者的基础命令
  • Laravel核心解读--Facades
  • MySQL几个简单SQL的优化
  • redis学习笔记(三):列表、集合、有序集合
  • scala基础语法(二)
  • 百度小程序遇到的问题
  • 扑朔迷离的属性和特性【彻底弄清】
  • 浅谈web中前端模板引擎的使用
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 正则与JS中的正则
  • 智能合约Solidity教程-事件和日志(一)
  • 自定义函数
  • Java性能优化之JVM GC(垃圾回收机制)
  • ​卜东波研究员:高观点下的少儿计算思维
  • #Linux(Source Insight安装及工程建立)
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)用.Net的File控件上传文件的解决方案
  • *1 计算机基础和操作系统基础及几大协议
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET Core中Emit的使用
  • .NET 回调、接口回调、 委托
  • .Net环境下的缓存技术介绍
  • @Valid和@NotNull字段校验使用
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [ACM] hdu 1201 18岁生日
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用
  • [ArcPy百科]第三节: Geometry信息中的空间参考解析
  • [DAU-FI Net开源 | Dual Attention UNet+特征融合+Sobel和Canny等算子解决语义分割痛点]
  • [ES-5.6.12] x-pack ssl
  • [go 反射] 进阶
  • [LeetCode]-Pascal's Triangle III 杨辉三角问题
  • [MFC] MFC消息机制的补充
  • [MSSQL]GROUPING SETS,ROLLUP,CUBE初体验
  • [MySQL FAQ]系列 -- 账号密码包含反斜线时怎么办