--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();
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 Haford
构造参数的使用:
   #include<iostream>
using namespace std; class tangle{
int x;
int y;
public:
tangle();
tangle(int x,int y);
void set_x(int x);
void set_y(int y);
int get_x() {return x;}
int get_y() {return y;}
};    --注意分号

tangle::tangle() {
x=;
y=;
}
tangle::tangle(int x,int y) {
this->x=x;    --this为指向自己的指针,不同于java的引用。
this->y=y;
}
void tangle::set_x(int x) {
this->x=x;
}
void tangle::set_y(int y) {
this->y=y;
} int main(int argc,char* argv[]) {
tangle a(,);
tangle *b=new tangle();    --new创建一个对象,返回指针
cout<<"a: "<<a.get_x()<<" "<<a.get_y()<<endl;
cout<<"b: "<<b->get_x()<<" "<<b->get_y()<<endl;
return ;
}
类成员函数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=; } //错误,有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 ;
}
补充:
如果const关键字不涉及到指针,我们很好理解,下面是涉及到指针的情况:         
int   b   =   ;
const int* a = &b; [] int const *a = &b; [] int* const a = &b; [] const int* const a = &b; []
如果你能区分出上述四种情况,那么,恭喜你,你已经迈出了可喜的一步。不知道,也没关系,我们可以参考《effective   c++》item21上的做法,如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的 右侧,const就是修饰指针本身,即指针本身是常量。因此,[1]和[2]的情况相同,都是指针所指向的内容为常量,这种情况下不允许对内容进行更改操 作,如不能*a   =   3   ;[3]为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的;[4]为指针本身和指向的内容均为常 量。 

 
 

c++类与初始化,const的更多相关文章

  1. 【转】forbids in-class initialization of non-const static member不能在类内初始化非const static成员

    转自:forbids in-class initialization of non-const static member不能在类内初始化非const static成员 今天写程序,出现一个新错误,好 ...

  2. C++ —— 非类中使用const定义常量的初始化,以及#define和typedef的区别

    总结一下在非类中使用const关键字定义常量时的初始化问题,亲测VS2015.顺便记录#define宏和typedef的区别. 1 首先对const声明的常量的初始化做简单小结: , w2 = , w ...

  3. C++类构造函数初始化列表

    C++类构造函数初始化列表 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: class CExample {public:     ...

  4. C++类构造函数初始化列表(转)

    构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: { public:     int a;     float b;     //构 ...

  5. 为什么static数据成员一定要在类外初始化?(转)

    1.避免重复定义和初始化 <<c++ primer>>说在类外定义和初始化是保证static成员变量只被定义一次的好方法. 但,为什么static const int就可以在类 ...

  6. jvm(2)类的初始化(一)

    [深入Java虚拟机]之三:类初始化 类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的Java程序代码. 1,下面说的初始化主要是类变量的初始化,实例变量的初始化触发条件不同(一 ...

  7. 【c++】类中的const成员

    const成员变量 举个例子 #include <iostream> using namespace std; class A { public: A(int size) : SIZE(s ...

  8. ZT 初始化 const 成员和引用类型成员(C++)

    初始化 const 成员和引用类型成员(C++) 初始化 const 成员和引用类型成员的问题,在 C++ 教材中讲述初始化列表的章节应该都有讲过,但是因为平时用得少,所以可能有不少人没注意到.待到用 ...

  9. C++ 静态成员的类内初始化

    一般来说,关于C++类静态成员的初始化,并不会让人感到难以理解,但是提到C++ 静态成员的"类内初始化"那就容易迷糊了. 我们来看如下代码: //example.h #includ ...

随机推荐

  1. 简单svg动画实现

    一.将svg嵌入到html中 svg是指可伸缩矢量图形,它使用XML格式定义图像.在html中可以使用<svg>标签直接嵌入svg代码,例如: <svg version=" ...

  2. 一张图告诉你angular2所有知识点

    忙活了半年,从angular2.0到现在angular4.2.从没AOT到有AOT.我想说,angular2的学习曲线真的有点陡峭.只能说,angular2是一个比较完整的框架,框架就是这样,一大堆条 ...

  3. centos6.5下redis安装步骤总结

    1.首先下载一个版本 我用的是3.2.9 解压:tar -zxvf /redis-stable.tar.gz 在/usr/local/新建redis文件夹 然后把解压好的文件夹移动到/usr/loca ...

  4. java编译出错信息汇总(更新)

    1. java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 原因:缺包mysql-connector-java-5.1.7-bin.jar 2 ...

  5. C++学习(三)入门篇——函数

    C++函数分两种:有返回值的和没返回值的 1.有返回值的函数 调用函数流程 如图,sqrt(6.25)为函数调用,被调用的函数叫做被调用函数,包含函数调用的函数叫做调用函数. 参数是发送给函数的信息, ...

  6. webpack热更新问题和antd design字体图标库扩展

    标题也不知道怎么写好,真是尴尬.不过话说回来,距离上一次写文快两个月了,最近有点忙,一直在开发新项目, 今天刚刚闲下来,项目准备提测.借这个功夫写点东西,把新项目上学到的一些好的干活分享一下,以便之后 ...

  7. vue vuex 提交 this.$store.commit({type: 'setSelectPro', selectPro: this.productId});

    1.store.commit({'type':'mutation','parameter':'value'}); store.dispatch('action'); 2.获取state保存的值 sto ...

  8. C# TSC打印二维码和条形码

    效果图 开发.使用环境说明 安装TSC_7.3.8_M-3.exe打印机驱动,安装时选择对应的ttp 244 pro 将TSCLIB.dll复制到C:\Windows\system 驱动安装说明 选择 ...

  9. 关于locals()、globals()以及作用域的一些感悟

    示例代码 i=6def foo(): print locals() print globals() i=66 print locals() print globals()class demo: i=6 ...

  10. 学习笔记TF026:多层感知机

    隐含层,指除输入.输出层外,的中间层.输入.输出层对外可见.隐含层对外不可见.理论上,只要隐含层节点足够多,只有一个隐含层,神经网络可以拟合任意函数.隐含层越多,越容易拟合复杂函数.拟合复杂函数,所需 ...